【问题标题】:Wrong item count at recyclerview inside a custom adapter of another recyclerview另一个 recyclerview 的自定义适配器内的 recyclerview 中的项目计数错误
【发布时间】:2016-11-30 07:22:21
【问题描述】:

所以我有这两个数组列表:

ArrayList<String> a = new ArrayList();
ArrayList<String> b = new ArrayList();

a.add("bear","lion","bird","goose","cat");
b.add("car","bike");

然后我将它们都添加到一个新的数组列表中:

ArrayList<ArrayList<String>> list = new ArrayList();

list.add(a);
list.add(b);    

然后,我将此arraylist 设置为recyclerview 的自定义适配器。在这个适配器内部,我还将这两个数组列表(位于最后一个数组列表中)设置为一个 recyclerview,它是适配器的项目视图。所以它是另一个recyclerview的自定义适配器内的recyclerview。

但是,当我调试应用程序时,第一个包含 5 个项目的数组列表在回收站视图中仅显示 2 个。像第二个数组列表。然后,当我删除第二个数组列表并再次调试应用程序时,第一个数组列表将显示其真实值。

如果我在 recyclerview 显示错误值后调用 notifyDataSetChanged(),它将显示其真实值。所以,我认为是因为某些视图(如果它是 recyclerview、fragment 或其他东西,我不会)还没有正确加载。

我应该如何解决这个问题?谢谢。

编辑: 这是我的适配器代码:

 public class MyAdapter extends RecyclerView.Adapter<AdapterNearMe.MyViewHolder> {

    private Context context;
    private List<List<String>> list;

    public class MyViewHolder extends RecyclerView.ViewHolder {
         public RecyclerView rView;

         public MyViewHolder(View view) {
              super(view);
              rView = (RecyclerView) view.findViewById(R.id.rview);
         }
     }

     public MyAdapter (Context context, List<List<String>> list) {
         this.context= context;
         this.list = list;
     }

     @Override
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_near_me, parent, false);

         return new MyViewHolder(itemView);
     }

     @Override
     public void onBindViewHolder(final MyViewHolder holder, final int position) {
        final List<String> newList= list.get(position);

        holder.rView.setAdapter(new AdapterRView(context,newList));
        holder.rView.setLayoutManager(new GridLayoutManager(context,3));
     }

     @Override
     public int getItemCount() {
        return list.size();
     }
}

【问题讨论】:

  • 你应该发布你的适配器代码
  • 好的,已经发布了。
  • 我认为@Raghunandan 的意思是发布整个适配器代码:) 至少实现了方法。

标签: android arraylist android-recyclerview adapter


【解决方案1】:

如何在 onCreateViewHolder() 方法中为 recyclerview 设置适配器(使用空数组列表)?然后用真实数据填充它,然后在 onBindViewHolder() 中调用 notifyDataSetChange() ?

public class MyAdapter extends RecyclerView.Adapter<AdapterNearMe.MyViewHolder> {

private Context context;
private List<List<String>> list;

public class MyViewHolder extends RecyclerView.ViewHolder {
     public RecyclerView rView;

     public MyViewHolder(View view) {
          super(view);
          rView = (RecyclerView) view.findViewById(R.id.rview);
          rView.setLayoutManager(new GridLayoutManager(context,3));
     }
 }

 public MyAdapter (Context context, List<List<String>> list) {
     this.context= context;
     this.list = list;
 }

 @Override
 public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     View itemView = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.item_near_me, parent, false);

     MyViewHolder holder = new MyViewHolder(itemView);
     holder.rView.setAdapter(new AdapterRView(context, new ArrayList<String>));

     return holder;

 }

 @Override
 public void onBindViewHolder(final MyViewHolder holder, final int position) {
    final List<String> newList = list.get(position);

    AdapterRView adapter = holder.rView.getAdapter();
    if (adapter != null) {
        adapter.swapList(newList);
        adapter.notifyDataSetChanged();
    }
 }

 @Override
 public int getItemCount() {
    return list.size();
 }
}

您需要添加一种额外的方法来交换 AdapterRView.class 的列表:

public class AdapterRView.class {

....

private List<String> list;

    public void swapList(List<String> list) {
        this.list = list;
    }
}

【讨论】:

    【解决方案2】:

    RecyclerView's bindViewHolder 使您可以在单元格view 上设置属性,而不是为父级adapter 设置adapter

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
    
    // This should single Model rather than List
    final List<Model> newList= list.get(position);
    
    // Instead of creating another recyclerview, check how to create section view
    holder.rView.setAdapter(new AdapterRView(context,newList));
    holder.rView.setLayoutManager(new GridLayoutManager(context,3));
    }
    

    【讨论】:

    • 对不起,我还不明白如何创建剖面图,你能给我举个简单的例子吗?或者也许是一个链接,所以我可以参考它。 :)
    • 我忘了说列表是我要放到适配器内部的recyclerview的列表,所以不能是模型或者字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2017-06-05
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    相关资源
    最近更新 更多