android开发学习 ------- RecyclerView多类型实例

曾无好事来相访,赖尔高文一起予。这篇文章主要讲述android开发学习 ------- RecyclerView多类型实例相关的知识,希望能为你提供帮助。
实现RecyclerView多类型的实例:效果如下图所示

android开发学习 ------- RecyclerView多类型实例

文章图片

public class CarFragment extends Fragment{private View view; private RecyclerView recycler; private CarAdapter madapter ; int colors[] = {R.color.app_color,R.color.oklib_frame_black,R.color.white}; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_car,container,false); //在布局中找到定义 recycler = view.findViewById(R.id.recyclerview); //grid一行有2列的意思 final GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2); gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { int type = recycler.getAdapter().getItemViewType(position); if(type == DataModel.TYPE_THREE){ return gridLayoutManager.getSpanCount(); }else{ return 1; //占据一个单元格 } } }); //设置布局管理器 //recycler.setLayoutManager(new LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL, //false)); recycler.setLayoutManager(gridLayoutManager); madapter =new CarAdapter(getContext()); //设置适配器 recycler.setAdapter(madapter); //添加item之间的分割线 recycler.addItemDecoration(new RecyclerView.ItemDecoration() { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { //super.getItemOffsets(outRect, view, parent, state); GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams(); int spansize = layoutParams.getSpanSize(); int spanindex = layoutParams.getSpanIndex(); outRect.top = 20; if(spansize != gridLayoutManager.getSpanCount()){ if(spanindex == 1){ outRect.left = 10; }else{ outRect.right = 10; } } } }); initData(); return view; }/** * 模拟list集合. * 针对三种不同的类型,可以去写三个实体类来代替DataModel. * */ private void initData(){List< DataModel> list = new ArrayList< > (); for(int i = 0; i < 30; i++){ //int type = (int)(Math.random()*3)+1; int type ; if( i < 6 || (i> 15 & & i< 20)){ type = 1; }else if(i< 10 || i> 26){ type = 2; }else{ type = 3; }DataModel data = https://www.songbingjia.com/android/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(); } }

public class DataModel {public int type; public int avatarColor; public String name; public String content; public int contentColor; /** * 静态常量去区分类型 , 需要创建三个不同的布局 */ public static final int TYPE_ONR = 1; public static final int TYPE_TWO = 2; public static final int TYPE_THREE = 3; }

public class CarAdapter extends RecyclerView.Adapter< RecyclerView.ViewHolder> {private LayoutInflater mLayoutInfater; private List< DataModel> mList = new ArrayList< > (); public CarAdapter(Context context) { mLayoutInfater = 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_ONR: return new TypeOneViewHolder(mLayoutInfater.inflate(R.layout.item_car1,parent,false)); case DataModel.TYPE_TWO: return new TypeTwoViewHolder(mLayoutInfater.inflate(R.layout.item_car2,parent,false)); case DataModel.TYPE_THREE: return new TypeThreeViewHolder(mLayoutInfater.inflate(R.layout.item_car3,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 getItemCount() { return mList.size(); }@Override public int getItemViewType(int position) { return mList.get(position).type; } }

public class TypeOneViewHolder extends TypeAbstractViewHolder{public ImageView avator; public TextView name; public TypeOneViewHolder(View itemView) { super(itemView); avator = itemView.findViewById(R.id.avator); name = itemView.findViewById(R.id.name); }@Override public void bingHolder(DataModel model) { avator.setBackgroundResource(model.avatarColor); name.setText(model.name); } }

public class TypeTwoViewHolder extends TypeAbstractViewHolder{public ImageView avator; public TextView name; public TextView content ; public TypeTwoViewHolder(View itemView) { super(itemView); avator = itemView.findViewById(R.id.avator); name = itemView.findViewById(R.id.name); content = itemView.findViewById(R.id.content); }@Override public void bingHolder(DataModel model) { avator.setBackgroundResource(model.avatarColor); name.setText(model.name); content.setText(model.content); } }

public class TypeThreeViewHolder extends TypeAbstractViewHolder{public ImageView avator; public TextView name; public TextView content ; public ImageView contentImage; public TypeThreeViewHolder(View itemView) { super(itemView); avator = itemView.findViewById(R.id.avator); name = itemView.findViewById(R.id.name); content = itemView.findViewById(R.id.content); contentImage = itemView.findViewById(R.id.contentImage); }@Override public void bingHolder(DataModel model) { avator.setBackgroundResource(model.avatarColor); name.setText(model.name); content.setText(model.content); contentImage.setBackgroundResource(model.contentColor); } }

fragment_car.xml
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> < android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" /> < /LinearLayout>

item_car1.xml
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout android:layout_height="60dp" android:layout_width="match_parent" android:gravity="center_vertical" android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android" > < ImageView android:layout_width="40dp" android:layout_height="40dp" android:id="@+id/avator" android:layout_marginLeft="20dp"/> < TextView android:id="@+id/name" android:text="lemon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> < /LinearLayout>

【android开发学习 ------- RecyclerView多类型实例】item_car2.xml
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout android:layout_height="60dp" android:layout_width="match_parent" android:gravity="center_vertical" android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android" > < ImageView android:layout_width="40dp" android:layout_height="40dp" android:id="@+id/avator" android:layout_marginLeft="20dp"/> < LinearLayout android:layout_marginLeft="20dp" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> < TextView android:id="@+id/name" android:text="lemon" android:textSize="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> < TextView android:id="@+id/content" android:text="lemon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> < /LinearLayout> < /LinearLayout>

item_car3.xml
< ?xml version="1.0" encoding="utf-8"?> < RelativeLayout android:layout_height="60dp" android:layout_width="match_parent" android:gravity="center_vertical" xmlns:android="http://schemas.android.com/apk/res/android" > < ImageView android:layout_centerVertical="true" android:layout_width="40dp" android:layout_height="40dp" android:id="@+id/avator" android:layout_marginLeft="20dp"/> < LinearLayout android:id="@+id/ll" android:layout_centerVertical="true" android:layout_toRightOf="@id/avator" android:layout_marginLeft="20dp" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> < TextView android:id="@+id/name" android:text="lemon" android:textSize="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> < TextView android:id="@+id/content" android:text="lemon" android:layout_marginTop="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> < /LinearLayout> < ImageView android:layout_alignParentRight="true" android:layout_toRightOf="@id/ll" android:layout_marginRight="20dp" android:layout_centerVertical="true" android:id="@+id/contentImage" android:layout_width="46dp" android:layout_height="46dp" /> < /RelativeLayout>

 
public abstract class TypeAbstractViewHolder extends RecyclerView.ViewHolder { public TypeAbstractViewHolder(View itemView) { super(itemView); } public abstract void bindHolder(DataModel model); }

 

    推荐阅读