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)
我已经用于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)
| 归档时间: |
|
| 查看次数: |
2770 次 |
| 最近记录: |