在很多时候会用到RecyclerView加载不同类型的布局,今天用两种不同的方式去实现。
主要写了7个类,四个和ViewHolder相关类,一个数据模型DataModel,一个DataAdapter,一个MainActivity,具体实现我会把代码详细写出来
MainActivity.java
package com.hongxin.recyclerview; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private DataAdapter mAdapter; int colors[]= {android.R.color.holo_blue_dark, android.R.color.holo_orange_dark, android.R.color.holo_red_dark}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView= (RecyclerView) findViewById(R.id.recyclerview); // mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false)); mRecyclerView.setLayoutManager(new GridLayoutManager(this,2)); mAdapter=new DataAdapter(this); mRecyclerView.setAdapter(mAdapter); initData(); } private void initData() { List<DataModel> list=new ArrayList<>(); for(int i=0;i<40;i++){ int type= (int) ((Math.random()*3)+1); DataModel data=new DataModel(); data.avatarColor=colors[type-1]; data.type=type; data.content="content:"+i; data.name="name:"+i; data.contentColor=colors[(type+1)%3]; list.add(data); } mAdapter.addList(list); mAdapter.notifyDataSetChanged(); } }
DataModel.java
public class DataModel { public static final int TYPE_ONE=1; public static final int TYPE_TWO=2; public static final int TYPE_THREE=3; public int type; public int avatarColor; public int contentColor; public String name; public String content; }DataAdapter.javaimport android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; public class DataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private LayoutInflater mInflater; private List<DataModel> mList=new ArrayList<>(); public DataAdapter(Context context) { mInflater=LayoutInflater.from(context); } public void addList(List<DataModel> list){ mList.addAll(list); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType){ case DataModel.TYPE_ONE: return new TypeOneViewHolder(mInflater.inflate(R.layout.item_type_one,parent,false)); case DataModel.TYPE_TWO: return new TypeTwoViewHolder(mInflater.inflate(R.layout.item_type_two,parent,false)); case DataModel.TYPE_THREE: return new TypeThreeViewHolder(mInflater.inflate(R.layout.item_type_three,parent,false)); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int viewType=getItemViewType(position); ((TypeAbstractViewHolder)holder).bindHolder(mList.get(position)); } @Override public int getItemViewType(int position) { return mList.get(position).type; } @Override public int getItemCount() { return mList.size(); } }TypeAbstractViewHolder.javapublic abstract class TypeAbstractViewHolder extends RecyclerView.ViewHolder { public TypeAbstractViewHolder(View itemView) { super(itemView); } public abstract void bindHolder(DataModel model); }TypeOneViewHolder.javapublic class TypeOneViewHolder extends TypeAbstractViewHolder { private ImageView avatar; private TextView name; public TypeOneViewHolder(View itemView) { super(itemView); avatar= (ImageView) itemView.findViewById(R.id.avatar); name= (TextView) itemView.findViewById(R.id.name); } @Override public void bindHolder(DataModel model){ avatar.setBackgroundResource(model.avatarColor); name.setText(model.name); } }TypeTwoViewHolder.javapublic class TypeTwoViewHolder extends TypeAbstractViewHolder { private ImageView avatar; private TextView name; private TextView content; public TypeTwoViewHolder(View itemView) { super(itemView); avatar= (ImageView) itemView.findViewById(R.id.avatar); name= (TextView) itemView.findViewById(R.id.name); content= (TextView) itemView.findViewById(R.id.content); } @Override public void bindHolder(DataModel model){ avatar.setBackgroundResource(model.avatarColor); name.setText(model.name); content.setText(model.content); } }TypeThreeViewHolder.javapublic class TypeThreeViewHolder extends TypeAbstractViewHolder { private ImageView avatar; private TextView name; private TextView content; private ImageView contentImage; public TypeThreeViewHolder(View itemView) { super(itemView); avatar= (ImageView) itemView.findViewById(R.id.avatar); name= (TextView) itemView.findViewById(R.id.name); content= (TextView) itemView.findViewById(R.id.content); contentImage= (ImageView) itemView.findViewById(R.id.contentImage); } @Override public void bindHolder(DataModel model){ avatar.setBackgroundResource(model.avatarColor); name.setText(model.name); content.setText(model.content); contentImage.setBackgroundResource(model.contentColor); } }源码地址http://download.csdn.net/detail/qq_35114086/9829458