RecylerView是support-v7包中的新布局,类似ListView也是一个可以显示集合的布局。
RecylerView顾名思义,是一个可以回收的布局,实际上就是集合布局复用view
虽然设置稍微复杂一点,但是它能实现的功能很强大
简答来说,它既可以当作listview用也可以当gridview用
我们来看一下怎么用它
首先 在gradle中添加编译依赖
compile 'com.android.support:recyclerview-v7:24.2.1'
之后就可以正常使用了
在布局中添加
<?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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.by.recyleviewtest.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/button"
android:text="Button"/>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recylerview"/>
</LinearLayout>
在代码中获取并设置相关参数
<span style="white-space:pre"> </span>RecyclerView view = (RecyclerView) findViewById(R.id.recylerview);
view.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyRecylerviewAdapter(getLayoutInflater(), list);
view.setAdapter(adapter);
设置LayoutManager是设置RecylerView显示的布局,这里设置的是线性布局
也就是设置RecylerView横向或纵向排列分布
Adapter需要我们自己来写,继承自RecylerView.Adapter
public class MyRecylerviewAdapter extends RecyclerView.Adapter<MyRecylerviewAdapter.ViewHolder> {
private List<String> list;
private LayoutInflater inflater;
public MyRecylerviewAdapter(LayoutInflater inflater, List<String> list) {
this.inflater = inflater;
this.list = list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.recylerview_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.textView.setText(list.get(position));
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
}
}
}
adapter和BaseAdapter不同
需要自己实现三个方法,getItemCount, onBindViewHolder,onCreateViewHolder
getItemCount是获取要显示的view的个数
onBindViewHolder和onCreateViewHolder共同实现了BaseAdapter中的getView方法的功能,
严格来讲还要RecyclerViewHolder算进来
onCreateViewHolder是创建ViewHolder,获取要显示的Item的布局,并传递给ViewHolder
ViewHolder用来绑定控件
onBindViewHolder实现ViewHolder中控件的显示要显示的东西
像我上面那么写,就是很简单的实现了
每个Item显示的布局也很简单,只有一个TextView
<?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="wrap_content"
android:padding="8dp">
<TextView
android:text="TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
这样写完,就实现了基本的ListView显示列表的功能
我们来看看,我们还有什么可以设置的
<span style="white-space:pre"> </span>LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
view.setLayoutManager(layoutManager);
这样设置就是横向的效果了
在来设置一下GridView的显示效果
GridLayoutManager layoutManager = new GridLayoutManager(this, 3);
view.setLayoutManager(layoutManager);
是不是挺厉害的,不用改其他东西,就这么改一下,就能实现不同的显示方式
这还只是setLayoutManager
我们来看一下其他设置
view.setItemAnimator(new DefaultItemAnimator());
设置这个的目的增加删除动画,这是默认动画,当然也可以自己编辑动画