我为此使用了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>
MainActivity.java inside onCreate()(标题)
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);
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>
* 我把 RecyclerView insied Row 放在里面有多个项目。
MainActivity RowAdapter
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);
}
}
}
在 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();
}
});
}
}
}