内容简介:自从Android 5.0 之后,google 推出了一个 RecyclerView 控件,他是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,RecyclerView相当于是ListView的升级版。RecyclerView 封装了 ViewHolder 的回收复用,也就是说RecyclerView标准化了 ViewHolder,编写Adapter面向的是 ViewHolder 而不是 View 了,复用的逻辑被封装了,写起来更加简单。
自从Android 5.0 之后,google 推出了一个 RecyclerView 控件,他是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,RecyclerView相当于是ListView的升级版。
RecyclerView 封装了 ViewHolder 的回收复用,也就是说RecyclerView标准化了 ViewHolder,编写Adapter面向的是 ViewHolder 而不是 View 了,复用的逻辑被封装了,写起来更加简单。
RecyclerView提供一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取了相应的类,来控制Item的显示,使其的扩展性特别强。
引入RecyclerVIew
compile 'com.android.support:recyclerview-v7:25.1.0' 复制代码
创建布局文件
主布局文件
/*activity_main.xml*/ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.manu.mrecyclerview.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout> 复制代码
Item布局文件
/*item.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="match_parent" android:padding="5dp"> <TextView android:id="@+id/tv_recycle" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text="data" android:background="#cac3c3" android:padding="10dp" android:textSize="20sp"/> </LinearLayout> 复制代码
创建Adapter
RecyclerView的Adapter要比ListView的Adapter设置起来稍微复杂一点,这也是RecyclerView高度解耦的体现,虽然代码复杂一点,但扩展性很好,下面介绍一下实现RecyclerView的Adapter的三个方法:
onCreateViewHolder()
该方法主要是为每个Item加载一个View,但是该方法返回的是一个ViewHolder,该方法吧View直接封装的ViewHolder中,然后我们面向的是ViewHolder这个实例,这个ViewHolder也由自己编写,但不用像ListView调用convertView.setTag(vh)和convertView.getTag()了。
onBindViewHolder()
该方法主要用来把数据绑定在View上,直接提供一个ViewHolder而不是convertView。
getItemCount()
该方法返回选项总数。
Adapter代码
/** * Created by jzman on 2017/5/13 0013. */ public class RvAdapter extends RecyclerView.Adapter<RvAdapter.DataViewHolder>{ private Context mContext; private ArrayList<String> mList; public RvAdapter() {} public RvAdapter(Context mContext, ArrayList<String> mList) { this.mContext = mContext; this.mList = mList; } //用于创建ViewHolder @Override public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.item,null); //使用代码设置宽高(xml布局设置无效时) view.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); DataViewHolder holder = new DataViewHolder(view); return holder; } //绑定数据 @Override public void onBindViewHolder(DataViewHolder holder, int position) { holder.tv_data.setText(mList.get(position)); } //数据总数 @Override public int getItemCount() { return mList.size(); } //创建ViewHolder public static class DataViewHolder extends RecyclerView.ViewHolder{ TextView tv_data; public DataViewHolder(View itemView) { super(itemView); tv_data = (TextView) itemView.findViewById(R.id.tv_recycle); } } 复制代码
使用StaggeredGridLayoutManager管理器时,Adapter参考如下:
/** * Created by jzman on 2017/5/13 0013. * RecycleView的Adapter */ public class RvAdapter extends RecyclerView.Adapter<RvAdapter.DataViewHolder>{ private Context mContext; private RecyclerView recyclerView; private ArrayList<String> mList; private ArrayList<Integer> mHeight; public RvAdapter() {} public RvAdapter(Context mContext, ArrayList<String> mList) { this.mContext = mContext; this.mList = mList; } /** * 初始化每个Item的高度(瀑布流效果) * @return */ public ArrayList<Integer> initHeight(){ mHeight = new ArrayList<>(); for (int i=0;i<mList.size();i++){ mHeight.add((int) (Math.random()*300)+200); } return mHeight; } /** * 用于创建ViewHolder * @param parent * @param viewType * @return */ @Override public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.item,null); //使用代码设置宽高(xml布局设置无效时) view.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); DataViewHolder holder = new DataViewHolder(view); return holder; } /** * 绑定数据 * @param holder * @param position */ @Override public void onBindViewHolder(DataViewHolder holder, int position) { //设置每个Item的高度 ViewGroup.LayoutParams h = holder.tv_data.getLayoutParams(); h.height = mHeight.get(position); holder.tv_data.setText(mList.get(position)); } /** * 选项总数 * @return */ @Override public int getItemCount() { return mList.size(); } /** * 创建ViewHolder */ public static class DataViewHolder extends RecyclerView.ViewHolder{ TextView tv_data; public DataViewHolder(View itemView) { super(itemView); tv_data = (TextView) itemView.findViewById(R.id.tv_recycle); } } /** * 将RecycleView附加到Adapter上 */ @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); this.recyclerView= recyclerView; //初始化每个Item的高度 initHeight(); } /** * 将RecycleView从Adapter解除 */ @Override public void onDetachedFromRecyclerView(RecyclerView recyclerView) { super.onDetachedFromRecyclerView(recyclerView); this.recyclerView = null; } } 复制代码
MainActivity
/** * Created by jzman on 2017/5/13 0013. */ public class MainActivity extends AppCompatActivity { private RecyclerView rv; RvAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rv = (RecyclerView) findViewById(R.id.rv); //设置布局管理器 rv.setLayoutManager(new LinearLayoutManager(this));//线性 // rv.setLayoutManager(new GridLayoutManager(this,4));//线性 // rv.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//线性 adapter = new RvAdapter(this,initData()); rv.setAdapter(adapter); } public static ArrayList<String> initData(){ ArrayList<String> arrayList = new ArrayList<>(); for (int i=0;i<50;i++){ arrayList.add("第"+i+"条数据"); } return arrayList; } } 复制代码
以上所述就是小编给大家介绍的《RecyclerView的简单使用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
PHP and MySQL Web Development (3rd Edition) (Developer's Library
Luke Welling、Laura Thomson / Sams / 2004-09-29 / USD 49.99
We've taken the best and made it even better. The third edition of the best-selling PHP and MySQL Web Development has been updated to include material and code on MySQL 5, PHP 5 and on PHPs object mod......一起来看看 《PHP and MySQL Web Development (3rd Edition) (Developer's Library》 这本书的介绍吧!