RecyclerView的使用(三)多布局
来源:互联网 发布:组策略 安装软件 编辑:程序博客网 时间:2024/06/08 19:19
RecyclerView的使用(三)多布局
在项目中,我们经常用到多布局的情况,跟ListView一样,我们需要通过ViewType来进行区分。
界面效果如图:
(一)单布局的Adapter
首先我们看下以前单布局的Adapter是如何去写的:
我们继承了RecyclerView.Adapter,泛型是MyAdapter 中继承的ViewHolder类,这样写后我们的onCreateViewHolder和onBindViewHolder的方法参数都是我们的ViewHolder了,是无法做到区分多布局的。
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ @Override public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) { } @Override public int getItemCount() { return 0; } //继承RecyclerView.ViewHolder class MyViewHolder extends RecyclerView.ViewHolder{ public MyViewHolder(View itemView) { super(itemView); } } }
(二)多布局的Adapter
多布局的Adapter我们泛型为RecyclerView.ViewHolder,通过ViewType,我们区分使用不同的ViewHolder。
RecyclerView提供了方法去区分ViewType
@Override public int getItemViewType(int position) { return super.getItemViewType(position); }
onCreateViewHolder的第二个参数int viewType就是getItemViewType的返回值
@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null;}
在onBindViewHolder中,我们的来绑定布局
@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}
我们看看如何去实现,我们首先定义两个标志,
public static final int ONE_ITEM = 1;public static final int TWO_ITEM = 2;
代码奉上
import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class ViewTypeActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<String> mDatas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initData(); setContentView(R.layout.activity_water_full); mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.addItemDecoration(new SpacesItemDecoration(12)); mRecyclerView.setAdapter(new ViewTypeAdapter()); } private void initData() { mDatas = new ArrayList<String>(); for (int i = 0; i < 24; i++) { mDatas.add("位置是" + i); } } class ViewTypeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ public static final int ONE_ITEM = 1; public static final int TWO_ITEM = 2; @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater mInflater = LayoutInflater.from(ViewTypeActivity.this); RecyclerView.ViewHolder holder = null; if(ONE_ITEM == viewType){ View v = mInflater.inflate(R.layout.item_linear,parent,false); holder = new OneViewHolder(v); }else{ View v = mInflater.inflate(R.layout.item_two,parent,false); holder = new TwoViewHolder(v); } return holder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceof OneViewHolder){ ((OneViewHolder) holder).tv.setText(mDatas.get(position)); }else { ((TwoViewHolder) holder).tv1.setText(mDatas.get(position)); ((TwoViewHolder) holder).tv2.setText(mDatas.get(position)); } } @Override public int getItemViewType(int position) { if(position % 3 == 0){ return TWO_ITEM; }else{ return ONE_ITEM; } } @Override public int getItemCount() { return mDatas.size(); } class OneViewHolder extends RecyclerView.ViewHolder{ TextView tv; public OneViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.adapter_linear_text); } } class TwoViewHolder extends RecyclerView.ViewHolder{ TextView tv1,tv2; public TwoViewHolder(View itemView) { super(itemView); tv1 = (TextView) itemView.findViewById(R.id.adapter_two_1); tv2 = (TextView) itemView.findViewById(R.id.adapter_two_2); } } }}
两个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="50dp" android:orientation="horizontal"> <TextView android:id="@+id/adapter_two_1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:layout_marginRight="5dp" android:background="#3FFF99" android:gravity="center" /> <TextView android:id="@+id/adapter_two_2" android:layout_width="0dp" android:layout_weight="1" android:layout_marginLeft="5dp" android:layout_height="match_parent" android:background="#3FFF99" android:gravity="center" /></LinearLayout>
<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/adapter_linear_text" android:layout_width="match_parent" android:layout_height="50dp" android:background="#a9a8ff" android:gravity="center"/>
间距的设定请看第一篇,效果图如下:
通过RecyclerView.Adapter设置多布局是非常方便的,而且大家可以发现当RecyclerView为LinearLayoutManager,我们可以通过viewType给RecyclerView来设置Header和Footer,如
public static final int HEADER = 1; public static final int FOOTER = 2; public static final int ITEM = 3; @Override public int getItemViewType(int position) { if(position == 0){ return HEADER; }else if(position == getItemCount() -1){ return FOOTER; }else{ return ITEM; } } @Override public int getItemCount() { return mDatas.size() + 2;//Header和Footer }
但是当布局管理器为GridLayoutManager和StaggeredGridLayoutManager时就要不能这样去做了。
如何去加我会放在后面去写。
0 0
- RecyclerView的使用(三)多布局
- RecyclerView 多布局使用
- Android RecyclerView 详解(五) RecyclerView多布局的使用
- RecyclerView的多布局
- android v7兼容包RecyclerView的使用(三)——布局管理器的使用
- MultiRecyclerView(多布局的RecyclerView)的简单使用
- RecyclerView 的使用以及多布局的实例
- RecyclerView 的使用(2)の多Item布局
- 使用 recyclerView 布局显示不合理的问题
- RecyclerView样式布局文件的简单使用
- recyclerView三种布局管理器
- android常用控件RecyclerView(三) RecyclerView的使用
- RecyclerView详细介绍-----多item布局(三)
- 一个简单的RecyclerView多布局实现
- RecyclerView多布局的简单实现
- RecyclerView多布局的简单实现
- RecyclerView的布局样式
- RecyclerView实现多布局
- JProfiler远程监控
- T-code:SE01,SE93,SE43 经常使用的几个事务码
- shuffle() 函数
- iOS---UITextView: 响应键盘的 return 事件
- 未能加载文件或程序集 NHibernate.XmlSerializers
- RecyclerView的使用(三)多布局
- Android--保持加速度传感器在屏幕关闭后运行(收集)
- python中文处理
- 再用UICollectionView做无限轮播的时候,布局错乱出现黑边,很可能是
- mybatis的mapper
- MySql模糊查询like通配符使用详细介绍
- 数据结构-题目
- android中树形json解析为对象,并通过dialog显示,多级列表
- 正则表达式学习参考