Android学习笔记之ListView与RecyclerView

本文探讨了Android中的ListView与RecyclerView的区别,指出RecyclerView具有更好的性能和更多功能。在实现悬浮球App时,利用RecyclerView的notifyItemRangeChanged()等方法进行局部更新。文章详细介绍了两者的基本使用,Adapter实现,以及在悬浮球App中的具体应用,包括如何处理编辑功能和数据同步问题。
摘要由CSDN通过智能技术生成

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同时只有一个显示,在前两个页面编辑的时候,第三个页面不会显示,所以直接进行界面更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值