首页 > 其他分享 >ListView超强总结

ListView超强总结

时间:2024-06-01 19:30:57浏览次数:25  
标签:总结 fruit View 超强 imageView ListView public view

       ListView由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有少量 的数据需要展示的时候,就可以借助ListView来实现。ListView允许用户通过手指上下滑动的方 式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。相信你其实每都 在使用这个控件,比如查看QQ聊天记录,微信好友列表,翻阅微博最新消息,等等。 作用: 在有限的屏幕展示少量的数据,可以实现滑动显示。

ListView的特别属性:

divider = 设置列表项之间的分割线

dividerHeigth = 设置列表项之间的高度

listSelector = 设置列表项选中时的背景

ListView xml布局

xml布局:

8eaac8c393ff48b98dd2e1ef817827f3.png

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <ListView
        android:id="@+id/List_V"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:listSelector="#839ABC"
        android:divider="#D82424"
        android:dividerHeight="10dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

自定义ListView

自定义ListView的数据展示list_item.xml布局:

4760dda3dd79498ebb4176261ed0222a.png

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="110dp">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="160dp"
        android:layout_height="100dp"
        android:scaleType="fitXY"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@tools:sample/avatars" />
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="52dp"
        android:text="TextView"
        app:layout_constraintBottom_toBottomOf="@+id/imageView"
        app:layout_constraintStart_toEndOf="@+id/imageView"
        app:layout_constraintTop_toTopOf="@+id/imageView"
        app:layout_constraintVertical_bias="0.469" />
</androidx.constraintlayout.widget.ConstraintLayout>

ListView数据实体类

定义一个数据实体类,作为ListView适配器的适配类型数据。

94001ddcd62a4e0a8d98771d7211e770.png

public class Fruit {
    Integer imageView;
    String name;
    public Integer getImageView() {
        return imageView;
    }
    public String getName() {
        return name;
    }
    public Fruit(Integer imageView,String name){
        this.imageView = imageView;
        this.name = name;
    }
}

ListView适配器ArrayAdapter<>

ListView适配器ArrayAdapter<Fruit>,目前我们ListView的运行效率是很低的,因为在FruitAdapter 的getView() 方法中,每次都将布局重新加载了一遍,当ListView快速滚动的时候,这就会成为性能的瓶颈。

ea0a88f90f5c40b0bc1a2f3eb44ca452.png

public class FruitAdapter extends ArrayAdapter<Fruit> {
    protected int resourceID;

    public FruitAdapter(@NonNull Context context, int resource, @NonNull List objects) {
        super(context, resource, objects);
        resourceID = resource;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Fruit fruit = (Fruit) getItem(position);
        View view = LayoutInflater.from(parent.getContext()).inflate(resourceID, parent, false);
        ImageView imageView = view.findViewById(R.id.imageView);
        TextView name = view.findViewById(R.id.name);
        imageView.setImageResource(fruit.getImageView());
        name.setText(fruit.getName());
        return view;
    }
}

ListView效率优化

      提升ListView运行效率,getView() 方法中有一个convertView 参数,这个参数用于将之前加载 好的布局进行缓存,以便之后可以进行重用: aaca19f6836644d0ad5c3613512c864e.png
public class FruitAdapter extends ArrayAdapter<Fruit> {
    protected int resourceID;
    public FruitAdapter(@NonNull Context context, int resource, @NonNull List objects) {
        super(context, resource, objects);
        resourceID = resource;
    }
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Fruit fruit = (Fruit) getItem(position);
        View view;
        if (convertView == null) {
            view = LayoutInflater.from(parent.getContext()).inflate(resourceID, parent, false);
        } else {
            view = convertView;
        }
        ImageView imageView = view.findViewById(R.id.imageView);
        TextView name = view.findViewById(R.id.name);
        imageView.setImageResource(fruit.getImageView());
        name.setText(fruit.getName());
        return view;
    }
}

ListView效率深度优化

      可以看到,现在我们在getView() 方法中进行了判断,如果convertView 为null ,则使 用LayoutInflater 去加载布局,如果不为null 则直接对convertView 进行重用。这样就 大大提高了ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。

不过,目前我们的这份代码还是可以继续优化的,虽然现在已经不会再重复去加载布局,但是 每次在getView() 方法中还是会调用View 的findViewById() 方法来获取一次控件的实 例。我们可以借助一个ViewHolder 来对这部分性能进行优化,修改FruitAdapter 中的代 码,如下所示

e965f97ac2a14f55a947411f94a60059.png

public class FruitAdapter extends ArrayAdapter<Fruit> {
    protected int resourceID;
    public FruitAdapter(@NonNull Context context, int resource, @NonNull List objects) {
        super(context, resource, objects);
        resourceID = resource;}
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Fruit fruit = (Fruit) getItem(position);
        View view;
        ViewHolder viewHolder;
        if (convertView == null) {
            view = LayoutInflater.from(parent.getContext()).inflate(resourceID,parent,false);
            viewHolder = new ViewHolder();
            viewHolder.fruit_imageView = view.findViewById(R.id.imageView);
            viewHolder.fruit_name = view.findViewById(R.id.name);
            view.setTag(viewHolder);//将viewHolder存储在view中
        }
       else {
           view = convertView;
           viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.fruit_imageView.setImageResource(fruit.getImageView());
        viewHolder.fruit_name.setText(fruit.getName());
        return view;}
    private class ViewHolder{ ImageView fruit_imageView;TextView fruit_name;}
}
    我们新增了一个内部类ViewHolder,用于对控件的实例进行缓存。当convertView为null的时候,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,然后调用View的setTag()方法,将ViewHolder对象存储在View 中。当convertView不为null的时候,则调用View的getTag()方法,把ViewHolder重新取出。这样所有控件的实例都缓存在了ViewHolder 里,就没有必要每次都通过findViewById() 方法来获取控件实例了。

List View监听事件

ListView的滚动毕竟只是满足了我们视觉上的效果,可是如果ListView中的子项不能 点击的话,这个控件就没有什么实际的用途了。因此,我们就设置ListView响应用户的点击事件listView.setOnTtemClickListener: 80a17bc1d1e942fa9bba50c368df2697.png
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Fruit fruit = list.get(position);
        Toast.makeText((Context) MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
    }
});

MainActivity中调用相应方法函数:

b9b0ca9d1d4444239f69ba6e01bebffa.png

public class MainActivity extends AppCompatActivity {
    List<Fruit> list = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        inF();
        ListView listView = findViewById(R.id.List_V);
        FruitAdapter adapter= new FruitAdapter(this,R.layout.list_item,list);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Fruit fruit = list.get(position);
                Toast.makeText((Context) MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
            }
        });
    }
    private void inF() {
        for (int i = 0; i < 1000; i++) {
            Fruit p1 = new Fruit(R.drawable.pg,"苹果");
            Fruit p2 = new Fruit(R.drawable.xj,"香蕉");
            list.add(p1);
            list.add(p2);
        }
    }
}
       我们使用setOnItemClickListener() 方法为ListView注册了一个监听器,当用 户点击了ListView中的任何一个子项时,就会回调onItemClick() 方法。在这个方法中可以通 过position 参数判断出用户点击的是哪一个子项,然后获取到相应的水果,并通过Toast将水 果的名字显示出来。

最终效果:

93e765f50bdf43c789aacee664cfae99.png

标签:总结,fruit,View,超强,imageView,ListView,public,view
From: https://blog.csdn.net/m0_74225871/article/details/139355482

相关文章

  • File类总结
    FIle对象既可以代表文件,也可以代表文件夹File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以不存在如何创建一个File对象publicstaticvoidmain(String[]args){//路径分隔符//Filef1=newFile("C:\\Users\\long\\Desktop\\111.jpg");//......
  • MySQL常用语句总结
    本篇MySQL语句笔记录笔记所引用案例为B站未明学院SQL课程教学案例,个人觉得这个UP主的视频讲解特别仔细,感兴趣小伙伴可以去听听~一、数据库操作(MySQL运行界面)按Pageup和Pagedown可以将之前出现过的命令正序或者倒序展示,避免重复输入命令。--展示所有的数据库SHOWDATABASE......
  • 【LInux内核中IO多路复用 背景+原理+直白总结+优缺点】EPoll篇 及大总结
    Linux内核中的epoll多路复用原理是基于事件驱动的一种高效I/O处理机制,它主要用于监视多个文件描述符(filedescriptors,简称fd)的状态并进行事件驱动的I/O操作。epoll相比传统的select和poll机制,在处理大量并发连接时具有更高的效率和更低的资源消耗。以下是epoll多路复用原理......
  • 学习前端的知识总结10
    CSS浮动网页布局方式有以下五种:标准流(普通流、文档流)︰网页按照元素的书写顺序依次排列浮动定位Flexbox和Grid(自适应布局)标准流是由块级元素和行内元素按照默认规定的方式来排列,块级就是占一行,行内元素一行放好多个元素。1.浮动浮动最典型的应用:可以让多个块级元素一行......
  • 学习前端的知识总结11
    1.浮动和标准流的父盒子搭配:先用标准流的父元素排列上下位置,之后内部子元素采取浮动排列左右位置2.一个元素浮动了,理论其余的兄弟元素也要浮动:一个盒子里面有多个子盒子,如果其中一个盒子浮动了,那么其他兄弟也应该浮动,以防止引起问题。浮动的盒子只会影响浮动盒子后面的......
  • 学习前端的知识总结12
    8.定位浮动可以让多个块级盒子一行没有缝隙排列显示,经常用于横向排列盒子。定位则是可以让盒子自由的在某个盒子内移动位置或者固定屏幕中某个位置,并且可以压住其他盒子。1.定位组成:定位︰将盒子定在某一个位置,所以定位也是在摆放盒子,按照定位的方式移动盒子。定位=定位模......
  • PTA题目集4-6总结
    1.前言知识点:主要考察类的设计与继承题量:每次题目主要是一道大题目难度:答题判题程序-4比较简单,只对题目类进行了改动,在题目类上做了继承家居强电电路模拟程序-1略难,主要是题目比较难懂,对类的设计要进行思考,做出合理的类设计家居强电电路模拟程序-2略难,主要为加入并联......
  • 总结常用9种下载(限速、多线程加速、ZIP、导Excel)
    一、前言下载文件在我们项目很常见,有下载视频、文件、图片、附件、导出Excel、导出Zip压缩文件等等,这里我对常见的下载做个简单的总结,主要有文件下载、限速下载、多文件打包下载、URL文件打包下载、Excel导出下载、Excel批量导出Zip包下载、多线程加速下载。二、搭建SpringBoo......
  • YOLOv10的改进、部署和微调训练总结
    YOLO模型因其在计算成本和检测性能之间的平衡而在实时目标检测中很受欢迎。前几天YOLOv10也刚刚发布了。我们这篇文章就来看看YOLOv10有哪些改进,如何部署,以及微调。YOLOv10通过无nms的训练解决了延迟问题,作者为无nms训练引入了一致的双任务,同时获得了具有竞争力的性能和低推理延......
  • 《经济管理》文本分析技术最新进展总结盘点
    [1]徐寿福,郑迎飞,张嘉宸.网络平台互动、策略性回应与股票错误定价[J].经济管理,2023,45(11):189-208.DOI:10.19616/j.cnki.bmj.2023.11.010.   关键词:网络平台互动;;股票错误定价;;策略性信息披露;;投资者意见分歧;;客套话   摘要:在依托“互动易”和“e互动”网络平......