【问题标题】:android recyclerview doesn't display itemsandroid recyclerview 不显示项目
【发布时间】:2015-07-17 03:19:36
【问题描述】:

我想在我的 recyclerview 中显示这些项目,但它根本不显示,我也看不到错误。也许你们可以帮帮我。

MainActivity.java

    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.rec);
List<MenuData> list = new ArrayList<>();
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager);

        MenuRecAdapter menuRecAdapter = new MenuRecAdapter(list);
        recyclerView.setAdapter(menuRecAdapter);

RecyclerView 适配器:

    public class MenuRecAdapter extends RecyclerView.Adapter<RecViewHolder>{

    private List<MenuData> mList;
    Activity context;

    public MenuRecAdapter(List<MenuData> mList){
        this.mList = mList;
    }

    public int getItemCount(){
        return mList.size();
    }

    public RecViewHolder onCreateViewHolder(ViewGroup viewGroup, int position){

        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.menuitem, viewGroup, false);
        RecViewHolder pvh = new RecViewHolder(v);
        return pvh;
    }

    public void onBindViewHolder(RecViewHolder holder, int i){
        holder.menuTeXT.setText(mList.get(i).text);
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

}

项目的ViewHolder:

  public class RecViewHolder extends RecyclerView.ViewHolder {

    public TextView menuTeXT;

    public RecViewHolder(View itemView){
        super(itemView);

        menuTeXT = (TextView)itemView.findViewById(R.id.menuTXT);
    }
}

以及我想放入我的 recyclerview 的数据(什么没有显示):

    class MenuData {

    String text;

    MenuData(String text){
        this.text = text;
    }

    private List<MenuData> list;

    private void initializeData(){
        list = new ArrayList<>();
        list.add(new MenuData("Featured"));
        list.add(new MenuData("Categories"));
        list.add(new MenuData("Sell"));
        list.add(new MenuData("Settings"));
        list.add(new MenuData("Logout"));
    }

}

提前致谢

【问题讨论】:

  • 你是否创建了一个 MenuData 的对象并调用 initializeData() 来创建一个列表,然后将它传递给适配器?
  • 我真的不明白你的意思。
  • 当你写MenuRecAdapter menuRecAdapter = new MenuRecAdapter(list);list已经创建了吗?
  • 喜欢List&lt;MenuData&gt; list = new ArrayList&lt;&gt;(); ?
  • 是的,但现在list 只是空的。在List&lt;MenuData&gt; list = new ArrayList&lt;&gt;(); 之后添加一些数据。喜欢list.add("something"); 并运行

标签: java android android-recyclerview


【解决方案1】:

由于您没有获得任何数据,我猜想问题发生在您将列表传递到适配器时。我看到您没有复制您的列表,因此您将列表的引用直接传递给适配器。我建议你试试 MenuRecAdapter menuRecAdapter = new MenuRecAdapter(new Arraylist(list));

【讨论】:

  • 仍然没有收到任何物品
  • 我没有看到您在代码中创建了任何 MenuData 实例。你的清单当然是空的。
【解决方案2】:

在主活动中

ArrayList<String> list = new ArrayList<>();
list.add("something1");
list.add("something2");

RecyclerView recyclerView = (RecyclerView)findViewById(R.id.rec);
recyclerView.setHasFixedSize(true);

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);

MenuRecAdapter menuRecAdapter = new MenuRecAdapter(list);
recyclerView.setAdapter(menuRecAdapter);

RecyclerView 适配器

public class MenuRecAdapter extends RecyclerView.Adapter<RecViewHolder>{

private ArrayList<String> mList = new ArrayList<>();
Activity context;

public MenuRecAdapter(ArrayList<String> mList){
    this.mList = mList;
}

public int getItemCount(){
    return mList.size();
}

public RecViewHolder onCreateViewHolder(ViewGroup viewGroup, int position){

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.menuitem, viewGroup, false);
    RecViewHolder pvh = new RecViewHolder(v);
    return pvh;
}

public void onBindViewHolder(RecViewHolder holder, int i){
    holder.menuTeXT.setText(mList.get(i));
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}
}

ViewHolder 保持不变...

public class RecViewHolder extends RecyclerView.ViewHolder {

public TextView menuTeXT;

public RecViewHolder(View itemView){
    super(itemView);

    menuTeXT = (TextView)itemView.findViewById(R.id.menuTXT);
}
}

也摆脱了 MenuData 类。上面的代码应该可以正常工作。

【讨论】:

  • 是的,LinearLayoutManager 在这里很重要。
  • 这是一个写得很糟糕的答案,根本没有解释修复是什么,只是一堆代码。这个答案是如何获得 53 票的?问题只是列表是空的?
【解决方案3】:

正如上面在 cmets 中提到的,问题可能在于未指定 RecyclerViewlayoutManager 属性。

layoutManager 可以在 XML 文件中指定,也可以在 Java 代码中动态指定。

上述答案中的 Java 代码示例:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);

要通过 XML 添加 layoutManager,请使用适当的属性:

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
         
   app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>

为我解决了这个问题。

【讨论】:

  • 谢谢你,伙计!从字面上看,你让我很开心。花了大约 8 个小时弄清楚我的自定义 RecyclerView 适配器出了什么问题。问题是我没有指定布局管理器来回收器视图本身。官方文档提到了布局管理器,但从未显示如何设置它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多