如何在不跳过布局的情况下为内部RecyclerView项设置适配器?

时间:2019-04-04 11:43:30

标签: android android-recyclerview android-adapter android-viewholder

我正在使用RecyclerView来显示一些数据。对于我的RecyclerView中的每个项目,我创建了一个自定义布局,该布局在其他视图旁边包含一个RecyclerView。所以我在每个项目下都有一个嵌套的RecyclerView。

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:layout_width="180dp"
        android:layout_height="45dp"
        android:id="@+id/recycler_view"/>

    //Other text views
</RelativeLayout>

内部RecyclerView的布局非常简单,每个项目都有一个ImageView,如下面的屏幕截图所示:

enter image description here 这是我的外部ReyclerView的适配器类:

class UserViewHolder extends RecyclerView.ViewHolder {
    View itemView;
    RecyclerView recyclerView;

    UserViewHolder(View itemView) {
        super(itemView);
        this.itemView = itemView;
        recyclerView = itemView.findViewById(R.id.recycler_view);
    }

    void bind(User user) {
        itemView.setOnClickListener(view -> {
            //Move to user Activity
        });

        UserAdapter adapter = new UserAdapter(user.list);
        recyclerView.setAdapter(adapter);
    }
}

如您所见,我正在为项目中存在的每个UserAdapter创建一个新的RecyclerView对象,以便每个内部RecyclerView都有自己的适配器。不幸的是,我得到了:

  

未连接适配器;跳过布局

如何为内部RecyclerView设置适配器,所以我再也无法收到此错误?可以在外部适配器类之外设置吗?谢谢!

编辑:

@Override
protected void onBindViewHolder(@NonNull UserViewHolder userViewHolder, int position, @NonNull User user) {
    userViewHolder.bind(user);
}

1 个答案:

答案 0 :(得分:1)

怎么做呢?

class UserViewHolder extends RecyclerView.ViewHolder {

   View itemView;
   RecyclerView recyclerView;
   UserAdapter adapter;

   UserViewHolder(View itemView) {
       super(itemView);
       this.itemView = itemView;
       recyclerView = itemView.findViewById(R.id.recycler_view);
       adapter = new UserAdapter(user.list);

       itemView.setOnClickListener(view -> {
        //Move to user Activity
       });
       recyclerView.setAdapter(adapter);

   }

   void bind(User user) {

       adapter.setUser(user);            // update you adapter dataset here
       adatper.notifyDataSetChanged();

   }
}

因此,void bind仅用于更新适配器数据集...