以下示例为搭建一个表格形式的列表。里面的 item 可以设置占用不同的列数。
Adapter示例:
public class SampleRecyclerViewAdapter extends RecyclerView.Adapter {
public enum ItemType{
TYPE_A,
TYPE_B,
}
private List<SampleRecyclerViewAdapter.DataItem> mDataSet;
private Context mContext;
public SampleRecyclerViewAdapter(Context context, List<SampleRecyclerViewAdapter.DataItem> dataSet) {
mDataSet = dataSet;
mContext = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
/**
* 不同类型卡片需要不同类型布局的话,在这设置
*/
if (ItemType.TYPE_A.ordinal() == viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_a, parent, false);
RecyclerView.ViewHolder vh = new AViewHolder(v);
return vh;
} else if (ItemType.TYPE_B.ordinal() == viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_b, parent, false);
RecyclerView.ViewHolder vh = new BViewHolder(v);
return vh;
}
return null;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
/**
* 根据需要调整单个卡片所占列数
*/
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if(manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager);
gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (ItemType.TYPE_A == mDataSet.get(position).mType) {
//占一列
return 1;
} else if (ItemType.TYPE_B == mDataSet.get(position).mType) {
//占两列
return 2;
}
return 1;
}
});
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
DataItem item = mDataSet.get(position);
/**
* 不同布局的 item 需要不同的 ViewHolder
*/
if (ItemType.TYPE_A == item.mType) {
AViewHolder aViewHolder = (AViewHolder) viewHolder;
aViewHolder.tv.setText(item.a);
} else if(ItemType.TYPE_B == item.mType) {
BViewHolder bViewHolder = (BViewHolder) viewHolder;
bViewHolder.iv.setImageDrawable(item.b);
}
}
@Override
public int getItemViewType(int position) {
/**
* 如果有多种类型的卡片,需要在这里给定卡片的类型的判断规则
*/
return mDataSet.get(position).mType.ordinal() ;
}
@Override
public int getItemCount() {
return mDataSet.size();
}
/**
* APP 类型卡片的ViewHolder
*/
private static class AViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public AViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.text_a);
}
}
/**
* 主卡片的 ViewHolder
*/
private class BViewHolder extends RecyclerView.ViewHolder {
ImageView iv;
public BViewHolder(View itemView) {
super(itemView);
iv = (ImageView) itemView.findViewById(R.id.image_b);
}
}
/**
* 各个卡片单元的基础数据对象
*/
public static class DataItem{
SampleRecyclerViewAdapter.ItemType mType;
String a;
Drawable b;
public void setType(SampleRecyclerViewAdapter.ItemType type) {
mType = type;
}
public void setA(String s) {
a = s;
}
public void setB(Drawable d) {
b = d;
}
}
}
布局文件示例:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:id="@+id/text_a"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<ImageView
android:id="@+id/image_b"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
最终调用方法示例
private void test() {
List<SampleRecyclerViewAdapter.DataItem> dataset = new ArrayList<>();
SampleRecyclerViewAdapter.DataItem a = new SampleRecyclerViewAdapter.DataItem();
a.setA("test");
SampleRecyclerViewAdapter.DataItem b = new SampleRecyclerViewAdapter.DataItem();
b.setB(getResources().getDrawable(R.drawable.ic_launcher));
dataset.add(a);
dataset.add(b);
mRecyclerView = (RecyclerView) findViewById(R.id.sample_recycler_view);
mRecyclerView.setHasFixedSize(true);
// 使用表格布局管理器,并设置列数为2。用于演示不同类型item可以占用不同的列数
mLayoutManager = new GridLayoutManager(
mRecyclerView.getContext(),
2,
GridLayoutManager.VERTICAL,
false);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new SampleRecyclerViewAdapter(this, dataset);
mRecyclerView.setAdapter(mAdapter);
}