Android学习笔记之ListView与RecyclerView
ListView与RecyclerView
RecyclerView相较于ListView拥有更简明的实现思路以及更好的优化和更多的方法,简言之,就是更高级。
两者的实现思路基本上一致,都是通过在xml布局中添加相应控件,实现Adapter适配器,再setAdapter()就完成了基本功能。而显然Adapter是整个过程核心部分,下面对两种方法进行简单介绍和对比。
ListView的使用
ListView的基本实现较为简单:
在Activity中setAdapter
MyAdapter adapter = new MyAdapter(data);
listView.setAdapter(adapter)
自定义Adapter的实现:
public MyAdapter extends ArrayAdapter<Object>{
public MyAdapter(Object data){};
@Override
public View getView(int position,View convertView,ViewGroup parent){
//根据position设置各个控件的状态和参数
return view;
};
}
这样实现了ListView的基本显示,但是在滚动时对每个控件都要用到getView方法,当滚动速度较快时,就会有点卡顿。所以引入了ConvertView和ViewHolder来进行缓存。而在RecyclerView中一开始就解决了这些问题。
RecyclerView的使用
RecyclerView在activity中的设置:
LinearLayoutManager lm = new LinearLayoutManager(this);
recyclerView.setLayoutManager(lm);
recyclerView.setAdapter(adapter);
对比ListView,添加了Layout布局样式的设置。因为RecyclerView可以实现横向滚动和瀑布布局,通过这里的布局样式设置就能简单实现。
下面是RecyclerView的自定义Adapter实现:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
static class ViewHolder extends RecyclerView.ViewHolder{
//获取item中的控件
}
public MyAdapter(){};//构造函数
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
//设置ViewHolder
}
@Override
public void onBindViewHolder(ViewHolder holder,int position){
//对holder进行赋值
}
@Override
public int getItemCount(){
//即传入的List的长度
}
}
可见,RecyclerView中包含了ViewHolder,虽然Adapter实现部分相较于ListView有些略长,但是实现思路很清晰。
ListView和RecyclerView
RecyclerView相较于ListView拥有更好的性能,且RecyclerView还有更多的功能。在实现本次悬浮球App时,使用了RecyclerView中的notifyItemRangeChanged()等功能,对局部控件进行了更新。
在悬浮球App中的应用
在该App中要实现三个列表页面,其中两个用来显示获取的桌面应用,第三个用来显示悬浮球菜单,都要拥有编辑功能。
在实现过程中,将三个页面的adapter合并为一个,在实现编辑的部分(将App加入菜单或删除)前两个页面直接调用的onBindViewHolder(),进行页面更新。这么使用的原因是notifyItemChanged()的具体实现就是通过调用onBindViewHolder()完成的,所以直接调用来实现。而第三个页面为菜单页,不仅要实现自身的编辑功能,还要实现对前两个页面的响应,所以在第三个页面自身编辑使用了notifyItemRangeChanged()来更新自身的状态,在使用该方法时,要先先使用notifyItemRemove(),将移除的App信息删除,否则会出现数据错乱问题。而对于前两个页面响应的实现,使用了本地广播的方法,在Receiver中直接更新界面,因为三个界面使用的ViewPager同时只有一个显示,在前两个页面编辑的时候,第三个页面不会显示,所以直接进行界面更新。