PS:文章末尾有案例下载哦!
RecyclerView 使用
RecyclerView 是 android-support-v7包中的一个控件,是一个强大的列表展示滑动组件,它的原理与listView有很多相似的地方,都是维护少量的View来进行显示大量的数据,不过RecyclerView控件比ListView更加高级并且更加灵活。
一、RecycleView的优点:
- 提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
二、RecycleView的主要方法:
- 你想要控制其显示的方式,请通过布局管理器LayoutManager
- 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
- 你想要控制Item增删的动画,请通过ItemAnimator
- 你想要控制点击、长按事件,请自己写(擦,这点尼玛。)
三、RecycleView的使用:
1、在gradle中添加jar包依赖:
compile 'com.android.support:recyclerview-v7:24.0.0'
2、基本使用
mRecyclerView = findView(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(layout);
//设置adapter
mRecyclerView.setAdapter(adapter)
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
ok,相比较于ListView的代码,ListView可能只需要去设置一个adapter就能正常使用了。而RecyclerView基本需要上面一系列的步骤,那么为什么会添加这么多的步骤呢?
那么就必须解释下RecyclerView的这个名字了,从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置。可以看出其高度的解耦,给予你充分的定制自由(所以你才可以轻松的通过这个控件实现ListView,GirdView,瀑布流等效果)。
3、简单实现
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<String> mDatas;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
initData();
//设置布局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置adapter
mRecyclerView.setAdapter(mAdapter= new MyAdapter());
//设置Item增加、移除动画
}
protected void initData()
{
mDatas = new ArrayList<>();
for (int i = 0; i < 30; i++)
{
mDatas.add(i + "");
}
}
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
MainActivity.this).inflate(R.layout.item_home, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public MyViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.item_tv);
}
}
}
}
activity布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
item布局,加了一行白线,作为伪分割线。
我们可以通过该方法添加分割线: mRecyclerView.addItemDecoration() 该方法的参数为RecyclerView.ItemDecoration,该类为抽象类,官方目前并没有提供默认的实现类
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/black">
<TextView
android:id="@+id/item_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:text="111"
android:layout_centerInParent="true"/>
<TextView
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/white"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
4、自定义Adapter:
参考案例中的自定义Adapter
四、RecycleView主要方法的使用:
1、LinearLayoutManager布局:
垂直布局:
mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
水平布局:
mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
2、GridLayoutManager布局:
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
3、StaggeredGridLayoutManager布局:
垂直布局:
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
水平布局:
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL));
4、设置item的动画效果:
RecyclerView 给我们提供了动画,默认动画是 DefaultItemAnimator。
5、Item的点击事件:
RecyclerView中默认没有提供onItemClick和onItemLongClick点击事件方法,需要我们自己在适配器中写接口来实现。
设置如下:
private OnItemClickListener mOnItemClickListener;
public interface OnItemClickListener {
void onItemClick(View view, int postion);
void onItemLongClick(View view, int postion);
}
//对外提供的一个监听方法
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
在onBindViewHolder()中调用接口
//如果设置了监听那么它就不为空,然后回调相应的方法
if (mOnItemClickListener != null) {
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//得到当前点击item的位置postion
int postion = myViewHolder.getLayoutPosition();
mOnItemClickListener.onItemClick(myViewHolder.itemView, postion);
}
});
myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int postion = myViewHolder.getLayoutPosition();
mOnItemClickListener.onItemLongClick(myViewHolder.itemView, postion);
return true;
}
});
}
关注微信公众号,更多优质文章等你阅读!
案例下载地址:https://github.com/AndStuFeng/RecyclerView-Test