如何使用 RecyclerView 适配器的数据并按参数将它们分成不同的组?

mar*_*337 6 android kotlin android-recyclerview

我正在处理RecyclerView,它将显示相同类型(相同对象)的数据,但这些对象中的每一个都必须在不同的ViewGroup. 例如对象有3 types. 每种类型将是单独的对象列表(按字母顺序排列类似于电话中的联系人列表的组)。

我看到了一些关于这个问题的帖子,但他们TreeMaps用来分离数据,但我不确定如何将它应用于我的问题。我有Header对象将显示在每组数据和Data对象上。我需要做的是将 3 个单独的组添加到一个组中List并将其发布到adapter.

此外,如果我修改此项目,我可以更改它的类型,因此每次修改项目时我都必须重新排列这些数据。下面有一个例子,它RecyclerView应该是什么样子(显示和适配器列表中的项目顺序)

例子:

Header1
Itemtype1
Itemtype1
Itemtype1
Itemtype1
Header2
Itemtype2
Itemtype2
Header3
Itemtype3
Itemtype3
Run Code Online (Sandbox Code Playgroud)

Ali*_*med 1

我已经用于Nested RecyclerView此目的。

也许不是实现这种布局的最佳技术。但它以某种方式起作用

MainActivity.xml(标头)

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout     
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".Activities.MainActivity">

<android.support.v7.widget.RecyclerView
    android:id="@+id/rvMain"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:listitem="@layout/row"
    />

</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

onCreate() 内的 MainActivity.java(标头)

    rvMain = findViewById(R.id.rvMain);
    ArrayList<Row> dataList = new ArrayList<>();
    myAdapter = new RowAdapter(MainActivity.this, dataList);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
    rvMain.setLayoutManager(layoutManager);
    rvMain.addItemDecoration(new DividerItemDecoration(MainActivity.this, LinearLayoutManager.VERTICAL));
    rvMain.setAdapter(myAdapter);
Run Code Online (Sandbox Code Playgroud)

MainActivity RecyclerView 的行

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   xmlns:tools="http://schemas.android.com/tools"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:padding="11dp">

<TextView
    android:id="@+id/tvAlbumNumber"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Album 1"
    android:textColor="#000"
    android:textSize="21sp"
    android:textStyle="bold"
    android:typeface="monospace"
    />

<android.support.v7.widget.RecyclerView
    android:id="@+id/rvAlbums"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tvAlbumNumber"
    android:layout_marginTop="3dp"
    tools:listitem="@layout/row_albums"
    />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

* 我将 RecyclerView 插入 Row 以在其中包含多个项目。

主要活动行适配器

public class RowAdapter extends RecyclerView.Adapter<RowAdapter.ViewHolder>{
   public  ArrayList<Row> arrayList;
   public Context context;
   int albumPos;

public RowAdapter(Context context, ArrayList<Row> arrayList) {
    this.arrayList = arrayList;
    this.context = context;
}

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

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    holder.tvAlbumNumber.setText("Album "+arrayList.get(position).getAlbumId());

    AlbumAdapter myAlbumAdapter = new AlbumAdapter(context, arrayList.get(position).getData());
    holder.rvAlbums.setLayoutManager(new LinearLayoutManager(context));
    holder.rvAlbums.setItemAnimator(new DefaultItemAnimator());
    holder.rvAlbums.addItemDecoration(new DividerItemDecoration(context,LinearLayoutManager.VERTICAL));
    holder.rvAlbums.setAdapter(myAlbumAdapter);
}

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

class ViewHolder extends RecyclerView.ViewHolder {
    TextView tvAlbumNumber;
    RecyclerView rvAlbums;

    public ViewHolder(View itemView) {
        super(itemView);
        tvAlbumNumber = itemView.findViewById(R.id.tvAlbumNumber);
        rvAlbums = itemView.findViewById(R.id.rvAlbums);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在 onBindViewHolder 内部,我调用 RecyclerView 来填充第一个标头中的项目

项目适配器(AlbumAdapter)(项目)

public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.AlbumViewHolder> {
    public ArrayList<RowAlbums> arrayList;
    private Context context;

AlbumAdapter(Context context, ArrayList<RowAlbums> arrayList) {
    this.context = context;
    this.arrayList = arrayList;
}

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

@Override
public void onBindViewHolder(@NonNull AlbumViewHolder holder, int position) {
    Picasso.get().load(arrayList.get(position).getImgUrl())
            .placeholder(R.drawable.user).error(R.drawable.user).into(holder.imgUser);
    holder.tvId.setText(arrayList.get(position).getId());
    holder.tvTitle.setText(arrayList.get(position).getTitle());
}

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

class AlbumViewHolder extends RecyclerView.ViewHolder {
    TextView tvId, tvTitle;
    ImageView imgUser;

    public AlbumViewHolder(final View itemView) {
        super(itemView);
        tvId = itemView.findViewById(R.id.tvId);
        tvTitle = itemView.findViewById(R.id.tvTitle);
        imgUser = itemView.findViewById(R.id.imgUser);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, arrayList.get(getAdapterPosition()).getTitle(), Toast.LENGTH_SHORT).show();
            }
        });
      }
    }
}
Run Code Online (Sandbox Code Playgroud)