在很多地方我们需要用到列表,而列表又有多种类别的内容显示,
现在列表一般采用recyclerview,那么如何在recyclerview中添加多类别的内容呢?
首先当然是要添加依赖
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
在main_activity.xml中添加控件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
新建两个布局,作为item的布局
item_first.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="布局一"
android:textSize="15sp"/>
</LinearLayout>
item_two.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/ic_launcher_background"/>
<TextView
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="布局二"
android:textSize="15sp"/>
</LinearLayout>
给recyclerview控件设置布局管理器
mRecycler.setLayoutManager(new LinearLayoutManager(this));
新建一个Adapter;关键就在Adapter里
注意:有几种类型要写几个viewholder
public class MyAdapter extends RecyclerView.Adapter{
private List<Integer> data;
private Context mContext;
private LayoutInflater mInflater;
private int type;
public MyAdapter(Context context, List<Integer> mData){
this.mContext = context;
this.data = mData;
this.mInflater = LayoutInflater.from(context);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 1) {
View view = mInflater.inflate (R.layout.item_first,parent, false);
FirstViewHolder viewHolder = new FirstViewHolder (view);
return viewHolder;
}else if(viewType==2){
View view = mInflater.inflate (R.layout.item_two,parent, false);
TwoViewHolder viewHolder = new TwoViewHolder (view);
return viewHolder;
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == 1) {
FirstViewHolder firstViewHolder= (FirstViewHolder) holder;
}else if(getItemViewType(position)==2) {
TwoViewHolder twoViewHolder= (TwoViewHolder) holder;
}
}
@Override
public int getItemCount() {
return data.size();
}
@Override
public int getItemViewType(int position) {
if(data.get(position)%2==0){
type=1;
}else {
type=2;
}
return type;
}
class FirstViewHolder extends RecyclerView.ViewHolder{
private TextView textView;
public FirstViewHolder( View itemView) {
super(itemView);
}
}
class TwoViewHolder extends RecyclerView.ViewHolder{
private TextView textView;
public TwoViewHolder( View itemView) {
super(itemView);
}
}
}
给recyclerview添加adapter:
public class MainActivity extends Activity {
private RecyclerView mRecycler;
private List<Integer> list;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecycler = findViewById(R.id.rv);
mRecycler.setLayoutManager(new LinearLayoutManager(this));
initdata();
myAdapter = new MyAdapter(this,list);
mRecycler.setAdapter(myAdapter);
}
private void initdata(){
list = new ArrayList<>();
for(int i = 0;i<8;i++){
list.add(i);
}
}
}
最后如图:
主要就是在getItemViewType()方法里进行类别筛选和在onCreateViewHolder()onBindViewHolder()方法里根据类别分别加入不同的ViewHolder.