Android RecyclerView
Recycler 中文:反复循环器
- 不关心Item是否显示在正确的位置,如何显示
- 不关心Item间如何分割
- 不关注Item增加与删除的动画效果
- 仅仅关注如何回收和复用View
LayoutManager 用来控制RecyclerView的不同显示风格
ItemDecoration 用来绘制Item间分割线及风格
ItemAnimator 用来控制Item的增加与删除动画
RecyclerView能做什么?
- ListView
- Gridview
- 横向ListView
- 横向GridView
- 瀑布流
- 定制Item增加与删除动画
实现ListView
首先导入RecyclerView包,Android studio中 File-> Project Structure -> Dependencies -> + -> Library Dependency -> support V7 RecyclerView。导入成功后就可以使用RecyclerView了。
创建布局
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent">
根据需求创建ItemView(我的是展示一个TextView)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="72dp" android:background="#44ff0000" android:orientation="vertical"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="TextView" /> </LinearLayout>
创建Adapter
在RecyclerView中强制使用ViewHolder,所以我们要先创建ViewHolder类
class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; public MyViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.textView); } }
我们的Adapter继承RecyclerView.Adapter,传入的是我们刚创建的ViewHolder类。
构造方法, datas是我们要传入的数据
public MySimpleAdapter(Context context, List<String> datas) { this.mContext = context; this.mDatas = datas; layoutInflater = LayoutInflater.from(context); }
重写其三个方法
//创建 @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View mView = layoutInflater.inflate(R.layout.itemview, parent, false); MyViewHolder myViewHolder = new MyViewHolder(mView); return myViewHolder; } //绑定 @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.tv.setText(mDatas.get(position)); } @Override public int getItemCount() { return mDatas.size(); }
Activity中调用
recyclerView = (RecyclerView) findViewById(R.id.recyclerview); simpleAdapter = new MySimpleAdapter(this, mDatas); recyclerView.setAdapter(simpleAdapter);
通过LayoutManager设置样式
//垂直 LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(layoutManager);
通过ItemDecoration设置分割线
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
我使用的是25.2.0版本,DividerItemDecoration()是已经系统实现了,不需要我们再自己去写。
效果:
如何自定义分割线颜色宽高
在drawable下新建newdivider.xml文件。
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> //高度 <size android:height="4dp" /> //颜色变化 <gradient android:centerColor="@color/colorPrimary" android:endColor="@color/colorPrimaryDark" android:startColor="@color/colorAccent" android:type="linear" /> </shape>
在styles.xml文件中,在你使用的theme中添加
<item name="android:listDivider">@drawable/newdivider</item>
效果: