RecyclerView属于新增控件,为了让RecyclerView在所有Android版本都能使用,所以Android团队将RecyclerView定义在了support库中,因此,想要使用RecyclerView控件,需要在build.gradle中添加相应的依赖库
implementation 'com.android.support:recyclerview-v7:26.1.0'
或者也可以直接引入support:design这个依赖,这个包括Recycler
implementation 'com.android.support:design:26.1.0'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
// implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
}
在布局中通过这个加入RecyclerView控件
<android.support.v7.widget.RecyclerView
android:id="@+id/act_test_rv"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
RecyclerView需要一些常用的方法,具体方法如下:
◆ setLayoutManager:设置列表项的布局管理器,
LinearLayoutManager为线性布局管理器、GridLayoutManager为网格布局管理器、StaggeredGridLayoutManager为瀑布流网格布局管理器。
◆ setItemAnimator:设置列表项增加或者是删除时的动画,可以使用关键字new创建 DefaultItemAnimator()对象实现系统默认的动画效果。
◆ addItemDecoration:添加列表项分割线。
◆ addOnItemTouchListener:添加列表项的触摸监听器。
◆ removeOnItemTouchListener:移除列表项的触摸监听器。
◆ setAdapter:设置列表项的适配器,使用RecyclerView.Adapter。
RecyclerView.Adapter是为RecyclerView所单独设计的适配器类,RecyclerView.Adapter的相关方法如下:
◆ getItemCount:获取列表项的数目。
◆ onBindViewHolder:绑定列表项中所显示的数据。
◆ onCreateViewHolder:在该方法中可以加载列表item(子项)中的布局文件。
在onCreate方法中设置布局管理器
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler);
recyclerView = findViewById(R.id.act_recyclerView);
//设置为线性布局管理器
// 上面的LinearLayoutManager有三个参数:
// (1) Context (2)方向,下面是垂直方向,还可以选择水平方向LinearLayoutManager.HORIZONTAL
// (3)是否颠倒循序,这个是针对数据源的,就是把你传进去的数据进行倒着显示,
// 比如你传进去的集合是{1,2,3,4},那么这个参数为false的时候,显示的是1,2,3,4,
// 但是如果你选择的是true,显示的是4,3,2,1。
// 效果跟listView差不多
recyclerView.setLayoutManager(new LinearLayoutManager(RecyclerActivity.this
, LinearLayoutManager.VERTICAL, false));
// 网格布局管理器(GridLayoutManager),这个布局管理器有两个参数:
// (1)Context (2)显示多少列
// 这种是比较常见和常用的布局管理器,把数据整整齐齐的想网格一样的把数据显示出来。
// recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
// 瀑布流布局管理器(StaggeredLayouManager):
// 有两个参数:
// (1)Context (2)显示列数
// 这个一般是用来显示那些item高度不一的布局的
// recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,
// StaggeredGridLayoutManager.VERTICAL));
}
新建一个Student类,其中属性有id和name,添加构造函数和Getter and Setter
这里就不放Student 的代码了
创建一个item所需的布局layout_student_item.xml,这里就简单写了两个TextView
<TextView
android:id="@+id/item_student_id_tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="id"
/>
下一步,新建一个适配器,并继承 android.support.v7.widget.RecyclerView.Adapter,
并自动实现其中的三个方法
StduentAdapter中的代码如下:
public class LinearAdapter extends RecyclerView.Adapter<LinearAdapter.LinearViewHolder> {
private Context mContext;
private List mList;
public LinearAdapter(Context mContext, List mList) {
this.mContext = mContext;
this.mList = mList;
}
//创建
@Override
public LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//在这里设置布局管理器
return new LinearViewHolder(LayoutInflater.from(mContext)
.inflate(R.layout.layout_student_item,parent,false));
}
@Override
public void onBindViewHolder(LinearViewHolder holder, int position) {
//将条目信息设置上
Student stu = (Student) mList.get(position);
holder.idTv.setText(""+stu.getId());
holder.nameTv.setText(stu.getName());
}
@Override
public int getItemCount() {
//设置条目的长度
return mList.size();
}
//创建一个LinearViewHolder类,
// 然后在RecyclerView.Adapter中添加泛型LinearAdapter.LinearViewHolder
class LinearViewHolder extends RecyclerView.ViewHolder {
private final TextView idTv;
private final TextView nameTv;
public LinearViewHolder(View itemView) {
super(itemView);
//声明布局里的控件
idTv = itemView.findViewById(R.id.item_student_id_tv);
nameTv = itemView.findViewById(R.id.item_student_name_tv);
}
}
}
最后在RecyclerActivity中添加如下代码
//创建一个集合用于存储对象
List ls = new ArrayList();
//这里测试,先循环插入一些数据
for (int i = 1; i <= 10000; i++) {
ls.add(new Student(i, "student"));
}
recyclerView.setAdapter(new LinearAdapter(this,ls));
这样列表基本功能就完成了,可是和ListView相比,少了条目分割线
RecyclerView可以自定义分割线,可以参照我的另一篇博客