【问题标题】:Can't inflate Views in RecyclerView无法在 RecyclerView 中膨胀视图
【发布时间】:2020-07-27 13:22:24
【问题描述】:

我是 Android 开发的菜鸟,今天我正在尝试构建一个自定义侧边栏。 我使用了一个带有 2 个 imageViews 的视图,并且我试图用多个图标多次充气它们,我使用自定义类来做到这一点。这是查看代码: Side_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:src="@drawable/icn"
        android:layout_height="48dp"
        android:tint="#afafaf"
        android:id="@+id/menu_icon"
        />

    <ImageView
        android:layout_width="8dp"
        android:layout_height="8dp"
        android:id="@+id/menu_selector"
        android:src="@drawable/selector"
        android:layout_gravity="center_horizontal"
        />


</LinearLayout>

这是我的自定义类:

public class Item
{
    private int icon, code;
    private boolean isSelected;

    public Item(int icon, int code)
    {
        this.icon = icon;
        this.code = code;
    }


    public int getIcon()
    {
        return icon;
    }

    public void setIcon(int icon)
    {
        this.icon = icon;
    }

    public int getCode()
    {
        return code;
    }

    public void setCode(int code)
    {
        this.code = code;
    }

    public boolean isSelected()
    {
        return isSelected;
    }

    public void setSelected(boolean selected)
    {
        isSelected = selected;
    }

    public Item(int icon, int code, boolean isSelected)
    {
        this.icon = icon;
        this.code = code;
        this.isSelected = isSelected;
    }
}

我使用此代码为此类分配数据:

public class MenuUtils
{
    public static final int HOME = 0, EDU = 1, CONTACT = 2, PROJECTS = 3;

    public static List<Item> getList()
    {
        List<Item> list = new ArrayList<>();

        list.add(new Item(R.drawable.icn1, HOME, true));
        list.add(new Item(R.drawable.icn2, EDU, true));
        list.add(new Item(R.drawable.icn3, CONTACT, true));
        list.add(new Item(R.drawable.icn4, PROJECTS, true));

        return list;
    }

}

这是我的适配器的代码:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
{
    List<Item> list;

    public MyAdapter(List<Item> list)
    {
        this.list = list;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.side_bar, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position)
    {
        holder.icon.setImageResource(list.get(position).getIcon());

        if (list.get(position).isSelected()) holder.selected.setVisibility(View.VISIBLE);
        else holder.selected.setVisibility(View.INVISIBLE);
    }

    @Override
    public int getItemCount()
    {
        Log.i("List Size", list.toString());
        return list.size();

    }

    public class MyViewHolder extends RecyclerView.ViewHolder
    {
        ImageView icon, selected;

        public MyViewHolder(@NonNull View itemView)
        {
            super(itemView);

            icon = (ImageView) itemView.findViewById(R.id.menu_icon);
            selected = (ImageView) itemView.findViewById(R.id.menu_selector);

        }
    }
}

侧边栏设置方法:

private void setMenu()
    {
        menu = findViewById(R.id.menu_holder);

        List<Item> items = MenuUtils.getList();

        MyAdapter adapter = new MyAdapter(items);

        menu.setLayoutManager(new LinearLayoutManager(this));
        menu.setAdapter(adapter);
    }

在记录时,我看到该列表有 4 个数据项,但是当膨胀时,只出现一个。 为什么这样? 请帮忙。

【问题讨论】:

    标签: android android-layout android-recyclerview


    【解决方案1】:

    我猜回收视图的每个项目都占据了整个屏幕,这就是为什么你只能看到一个项目。调整 LinearLayout 的高度和宽度,如-

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    ......
    </LinearLayout>
    

    如果您希望每个项目占据整个屏幕宽度,请使用

    android:layout_width="match_parent"
    

    反之亦然。

    编码愉快!!!

    【讨论】:

      【解决方案2】:

      因为您将高度用作match_parent。 应该是wrap_content:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
      
          <ImageView
              android:layout_width="match_parent"
              android:src="@drawable/icn"
              android:layout_height="48dp"
              android:tint="#afafaf"
              android:id="@+id/menu_icon"
              />
      
          <ImageView
              android:layout_width="8dp"
              android:layout_height="8dp"
              android:id="@+id/menu_selector"
              android:src="@drawable/selector"
              android:layout_gravity="center_horizontal"
              />
      
      
      </LinearLayout>
      

      【讨论】:

        【解决方案3】:

        因为第一项展开全屏,所以你看不到其他的 您必须将 xml 高度从 match_parent 更改为 wrap_content

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> <!--change this line-->
        
            <ImageView
                android:layout_width="match_parent"
                android:src="@drawable/icn"
                android:layout_height="48dp"
                android:tint="#afafaf"
                android:id="@+id/menu_icon"
                />
        
            <ImageView
                android:layout_width="8dp"
                android:layout_height="8dp"
                android:id="@+id/menu_selector"
                android:src="@drawable/selector"
                android:layout_gravity="center_horizontal"
                />
        </LinearLayout>
        

        【讨论】:

          猜你喜欢
          • 2018-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多