Android学习笔记五—-关于ListView和RecyclerView的简单使用

  • Post author:
  • Post category:其他

在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在处理视图列表时占有巨大优势。


版权声明:本文为qq_37978130原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。