在Android的开发中,难免会遇到使用列表的问题这个时候就要用到ListView和RecyclerView了。根据我的学习情况进行简单记录。
ListView 是安卓中常用的一种列表控件。
他的使用主要时分为两步步
生成ArrayAdapter适配器 —> listview对象通过setAdapter(adapter)函数使用适配器即可
主要步骤是适配器的生成,适配器的生成主要需要三个参数,
1、当前类即 类名.this
2、布局文件,如果只用一个字符串的话就直接使用android.R.layout.simple_list_item_1
3、具体内容,即list中要显示给用户的东西(string数组或者list容器,具体的依据具体情况分析)
案例一:
当输入即所需要的list中的元素是字符串(等简单内容)时,操作十分简单。
1)、声明一个字符串数组,存放list数据。
2)、声明一个adapter的适配器-ArrayAdapter三个参数,依次为this,android.R.layout.simple_list_item_1,字符串数组。
3)、根据id找到ListView,利用setAdapter函数引用adapter
案例二:
当输入的为自定义的布局时,操作略有复杂。
1)、声明一个存list元素(即自定义布局)的容器(可以是数组)。
2)、需要构建一个新的类,这个类就是list的元素(需要实例化)。
3)、需要一个自定义的适配器,因为如果用自定义布局的话,原始的适配器就不行了,需要一个继承于原适配器的适配器。
1、重写构造方法,自定义传入的第三个参数,可以是容器,也可以是数组,具体的根据重写的方法来判断。
三个参数,第一个是当前活动,第二个是布局id,第三个是子列表,需要记录下第id,后面要用到
2、重写他的getView(int position,View convertView,ViewGroup parent)(生成并显示列表,当列表创建和滚动时会需要)方法,
利用getItem(position)获得当前子布局实例 -> 获取自定义View对象 -> 对对象进行实例化 -> 对实例化的数据添加资源 -> 返回对象
4)、传入参数。
5)、setAdapter方法调用。
关于效率:
效率主要是在getView上需要提升,
1)、防止滚动过程重复加载布局
一个选择结构就行,如果所需布局为空就加载,否则保留
2)、防止因为每一次加载子布局时都使用findviewById()方法
利用一个view储存,一个内部类viewdata做缓存
关于点击事件:
直接在活动里面调用setOnItemClickListener(),调用内部类,即可。
RecyclerView是一种新的列表,他能解决ListView的很多问题,例如效率问题关于他的使用和listView有很多相互联系的,也有一定的区分
使用方法:
1、声明列表元素,同样可以是数组,也可以是链表
2、声明RecyclerView的元素排列方式(即线性的还是其他的)
利用
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
诸如这种,这里声明的是线性排列
3、和ListView一样,利用适配器将列表元素导入。
4、利用setAdapter(adapter)方法将适配器导入即可。
案例:
按照上面的思想,当列表元素不为简单的元素,而为新鲜自定义的布局时就需要定义一个新的继承于RecyclerView.Adapter<>的适配器了,而定义适配器这里和listView相比较,相同的是要重写构造方法,不同的是它还要重写好几个方法,一一总结。
1、对于继承,在集成式要对RecyclerView.Adaptr<>进行设置,即class MyAdapter extends RecyclerView.Adapter< MyAdapter.ViewHolder>。这里的MyAdapter.ViewHolder是的MyAdapter的一个内部类,他继承于RecyclerView.ViewHolder在内部继承时需要重写构造方法:ViewHolder(@NonNull View itemView) {},主要作用是获取列表子元素的各数据储存于ViewGroup中做缓存。
2、重写public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)方法,该方法的作用是返回列表子元素布局。
3、重写public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i)方法,作用是将列表的第i个元素进行赋值。
4、重写public int getItemCount()方法,很简单,返回列表的个数
实现listView无法实现的功能:
虽然说RecyclerView没有ListView的效率问题,但是实现的依旧是ListView的功能。
RecyclerView同样可以实现ListView无法实现的其他功能
一、横向滚动布局
实现RecyclerView竖直布局的时候,第二步是声明排列方式,声明了LinearLayoutManager对象,表示线性布局。既然是线性布局那么除了竖直线性之外,肯定有水平线性。只需要在声明对象之后使用setOrientation()函数改变默认的布局方式就行。
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
二、实现网格布局
网格布局肯定不是线性布局了,所以要声明新的排列方式。
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.HORIZONTAL);
表示每一个水平方向有3个排列完了自动下一行。然后引用就行了。
关于点击事件:
同样RecyclerView也是有点击事件的。同样的没有点击事件这个控件就没什么用了
他的点击事件可以比ListView更容易达到对子项布局的内部点击
使用方法:
在MyAdapter中实现
1、在创建内部类的时候,定义一个View,将列表子布局传入。
2、在重写的public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)方法中实现。这个方法是将布局进行缓存的方法,对布局进行按键点击事件的注册声明,最后将声明的布局一起缓存,即可。
相比较之下MyAdapter更在处理一些简单的文本列表时简单一点,而RecyclerView则比较复杂一点,但是RecyclerView在处理视图列表时占有巨大优势。