RecyclerView也是用很久了,但一段时间不用之后还是会要各种查资料找用法,所以,还是有必要记录一下它的基本用法。
RecyclerView,是官方在Android5.0推出的新组件,它集成在support-v7包中。RecyclerView并不是取代ListView的,各有侧重,不过RecyclerView的出现,使大量数据的展示更为方便和多样化。比如横向滚动,比如瀑布流布局。OK,介绍就到这里 ,下面进入它的简单使用:
因为RecyclerView是集成在support-v7包里的,所以我们第一步就是导入:
implementation 'com.android.support:recyclerview-v7:28.0.0'
我这里使用的版本比较高,各位可以根据自己的实际情况添加对应的v7包。
然后你就可以在布局文件中添加RecyclerView控件了:
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Activity中初始化并生成简单的数据,这里需要主意一点的是,RecyclerView和ListView的用法还是有些区别的,RecyclerView需要设置布局管理器以控制Item的布局方式,比如横向、竖向以及瀑布流方式,这里就不具体展开,大家有兴趣可以自行去研究,我这里就以普遍的LinearLayoutManager来做示范。
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
//测试数据集合
private List<Map<String, Object>> datas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notification_test);
//准备测试数据
for (int i=0;i<10;i++) {
Map<String, Object> map = new HashMap<>();
map.put("title", "万历十五年" + i);
map.put("content", "在《万历十五年》一书中,黄仁宇用近乎平淡的笔触分析一个皇朝从兴盛走向衰颓的原因,而这些平淡的叙述自有力量,他淡然勾勒出的人生困境,即便是对历史学不感兴趣的读者,也心有戚戚焉。");
datas.add(map);
}
recyclerView = findViewById(R.id.recyclerview);
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(new TestAdapter(this, datas));
}
和ListView的使用基本差不多,同样的设置Adapter,下面是Adapter的代码:
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView title;
public TextView content;
public ViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.tv_title);
content = itemView.findViewById(R.id.tv_content);
}
}
private List<Map<String, Object>> mDatas;
private final Context context;
public TestAdapter(Context context, List<Map<String, Object>> mDatas) {
this.context = context;
this.mDatas = mDatas;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.recyclerview_item,null);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
viewHolder.title.setText(mDatas.get(i).get("title").toString());
viewHolder.content.setText(mDatas.get(i).get("content").toString());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "点击"+mDatas.get(i).get("title").toString(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return mDatas.size();
}
}
可能大家都会注意到,这里和ListView的Adapter还是有点区别的,具体说一下吧,首先,RecyclerView的Adapter继承的是RecyclerView.Adapter,并且泛型添加ViewHolder,此处ViewHolder直接实现在Adapter里。然后在onCreateViewHolder里通过
LayoutInflater.from(context).inflate(R.layout.recyclerview_item,null);
得到具体项的布局view,最后返回的是这个view的ViewHolder。在onBindViewHolder里,我们可以设置各项组件所显示的内容并且设置点击事件,我这里设置的是itemView的点击事件,就是点击这一项都会有响应,你也可以直接设置某一个控件的点击事件,具体方法是一样的。
好了,相对来说比较简单,因为和ListView的用法虽然有点出入,但还是大同小异的,只是要注意那些不一样的地方。下面上效果图:
暂时只关注功能实现哈,界面什么的,各位都是大牛。不过有细心的读者可能会发现问题,为什么项与项之间没有任何分隔,是的,RecyclerView默认没有分隔线,并不是说没有这个功能 ,相反,RecyclerView还把这个功能实现的非常好,让你可以自定义分隔线,不过这里就不展开讲,我们通过一个最简单的方式添加一根默认的分隔线:
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
ok,就添加这一句话 ,我们就实现了分隔线的功能,看效果:
OK,打完收工。