Android studio 之 ListView

这篇具有很好参考价值的文章主要介绍了Android studio 之 ListView。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ListView 绑定的适配器是 BaseAdapter。

// 获取视图(设置 listView 每一项的显示效果)
    /* 参数1:当前Item的下标 --- 和数据源的下标相同,可以由此获取数据源配置item
     * 参数2:当前Item的view
     * 参数3:当前视图的父视图(可调整当前视图的宽高)*/
    public View getView(int position, View convertView, ViewGroup parent) {
        // 完成对view的设置
        // 将设置好的 item 布局资源转换成view
        convertView = LayoutInflater.from(context).inflate(R.layout.baseadapter_item,null); // 此时得到的是最初的item布局,没有添加的数据

        // 获取数据源[position] 的数据,并将他们设置到item视图中的控件中
        BaseMsg m = baseMsgList.get(position); // 获取item的数据列表

        ImageView imageView = convertView.findViewById(R.id.base_icon);
        imageView.setImageResource(m.getIcon());

        TextView tN = convertView.findViewById(R.id.base_name);
        tN.setText(m.getNickName());

        TextView tC = convertView.findViewById(R.id.base_content);
        tC.setText(m.getContent());

        // 可以给item的单个控件设置点击事件
        tN.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              //  System.out.printf("点击了"+tN.getText());
                Toast.makeText(context,"你点击了"+m.getNickName(),Toast.LENGTH_SHORT).show();
            }
        });
        return convertView;
    }

问题一:优化view对象 

在MyAdapter类中的getView方法中,我们注意到,上面的写法在每个视图出现时都会执行,有多少个item就会调用多少次 getView() 如果item太多就会很浪费资源!!

优化:可以复用convertView

  • 在 getView 方法中,首先检查 convertView 是否为空。
  • 如果为空,表示当前屏幕上没有可复用的 item 视图,需要创建新的视图并进行布局设置。
  • 但是,如果 convertView 不为空,就意味着该视图已经被创建过,并且已经在屏幕上显示过,这时我们可以直接复用 convertView,避免了重复的布局加载和赋值操作
 public View getView(int position, View convertView, ViewGroup parent) {

        // 优化1:利用进入 RecyclerBin 中的view,减少对view的赋值
        /* 当视图第一次构建后,上下滑动到看不见时就会进入 RecyclerBin,此时 convertView 就不为null,
         * 我们就可以复用这个 convertView */
        if( convertView == null){
            // 完成对view的设置
            // 将设置好的 item 布局资源转换成view
            convertView = LayoutInflater.from(context).inflate(R.layout.baseadapter_item,null); // 此时得到的是最初的item布局,没有添加的数据
            System.out.println("当前显示的视图"+(position+1));
        }
        // 获取数据源[position] 的数据,并将他们设置到item视图中的控件中
        BaseMsg m = baseMsgList.get(position); // 获取item的数据列表

        ImageView imageView = convertView.findViewById(R.id.base_icon);
        imageView.setImageResource(m.getIcon());

        TextView tN = convertView.findViewById(R.id.base_name);
        tN.setText(m.getNickName());

        TextView tC = convertView.findViewById(R.id.base_content);
        tC.setText(m.getContent());

        // 可以给item的单个控件设置点击事件
        tN.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              //  System.out.printf("点击了"+tN.getText());
                Toast.makeText(context,"你点击了"+m.getNickName(),Toast.LENGTH_SHORT).show();
            }
        });
        return convertView;
    }

问题二:优化view中组件的查找 

即使经过优化1的步骤,可以减少view的构建,但是每出现一个view已经会寻找一次控件id,findViewById 依旧十分浪费资源,因此可以进行第二步优化

优化:利用viewHolder

在convertView为null的时候,我们不仅重新inflate出来一个view,并且还需要进行findviewbyId的查找工作,但是同时我们还需要获取一个ViewHolder类的对象,并将findviewById的结果赋值给ViewHolder中对应的成员变量。最后将holder对象与该view对象“绑”在一块--setTag方法

当convertView不为null时,我们让view=converView,同时取出这个view对应的holder对象--getTag方法,就获得了这个view对象中的TextView组件,文章来源地址https://www.toymoban.com/news/detail-818676.html

// 即使经过优化1的步骤,可以减少view的构建,但是每出现一个view已经会寻找一次控件id,findViewById 依旧十分浪费资源,因此可以进行第二步优化
// 1.定义一个 内部类 ViewHolder,并声明需要用到的控件属性
// 2.当 convertView == null 当前视图没有被创建时,初始化一个 ViewHolder 对象,并为其中的控件赋值
// 3.调用 contvertView.setTag(ViewHolder) 将这个 HolderView 绑定到这个view中
// 4.当 convertView != null时,通过 contvertView.getTag() 找到绑定的ViewHolder
       
ViewHolder holder;
if (convertView == null) {
  // 完成对view的设置
  // 将设置好的 item 布局资源转换成view
  convertView = LayoutInflater.from(context).inflate(R.layout.baseadapter_item, null); // 此时得到的是最初的item布局,没有添加的数据

   holder = new ViewHolder();
   holder.icon = convertView.findViewById(R.id.base_icon);
   holder.nickName = convertView.findViewById(R.id.base_name);
   holder.content = convertView.findViewById(R.id.base_content);
   convertView.setTag(holder);
   System.out.println("当前显示的视图" + (position + 1));
} else {
   holder = (ViewHolder) convertView.getTag(); // 取出view中绑定的ViewHolder,此时要强转成 ViewHolder 类型
 }
 public View getView(int position, View convertView, ViewGroup parent) {

        // 优化1:利用进入 RecyclerBin 中的view,减少对view的赋值
        /* 当视图第一次构建后,上下滑动到看不见时就会进入 RecyclerBin,此时 convertView 就不为null,
         * 我们就可以复用这个 convertView */

        // 即使经过优化1的步骤,可以减少view的构建,但是每出现一个view已经会寻找一次控件id,findViewById 依旧十分浪费资源,因此可以进行第二步优化
        // 1.定义一个 内部类 ViewHolder,并声明需要用到的控件属性
        // 2.当 convertView == null 当前视图没有被创建时,初始化一个 ViewHolder 对象,并为其中的控件赋值
        // 3.调用 contvertView.setTag(ViewHolder) 将这个 HolderView 保存到这个view中
        // 4.当 convertView != null时,通过 contvertView.getTag() 找到保存的ViewHolder
        ViewHolder holder;
        if (convertView == null) {
            // 完成对view的设置
            // 将设置好的 item 布局资源转换成view
            convertView = LayoutInflater.from(context).inflate(R.layout.baseadapter_item, null); // 此时得到的是最初的item布局,没有添加的数据

            holder = new ViewHolder();
            holder.icon = convertView.findViewById(R.id.base_icon);
            holder.nickName = convertView.findViewById(R.id.base_name);
            holder.content = convertView.findViewById(R.id.base_content);
            convertView.setTag(holder);

            System.out.println("当前显示的视图" + (position + 1));
        } else {
            holder = (ViewHolder) convertView.getTag(); // 此时要强转成 ViewHolder 类型
        }
        // 获取数据源[position] 的数据,并将他们设置到item视图中的控件中
        BaseMsg m = baseMsgList.get(position); // 获取item的数据列表

        /*ImageView imageView = convertView.findViewById(R.id.base_icon);
        imageView.setImageResource(m.getIcon());*/
        holder.icon.setImageResource(m.getIcon());

        /*TextView tN = convertView.findViewById(R.id.base_name);
        tN.setText(m.getNickName());*/
        holder.nickName.setText(m.getNickName());

        /*TextView tC = convertView.findViewById(R.id.base_content);
        tC.setText(m.getContent());*/
        holder.content.setText(m.getContent());

        // 可以给item的单个控件设置点击事件
        holder.nickName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "你点击了" + m.getNickName(), Toast.LENGTH_SHORT).show();
            }
        });
        return convertView;
    }

到了这里,关于Android studio 之 ListView的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)

    需要图片集或全部源码请点赞关注收藏后评论区留言~~ 如果想在页面上直接显示全部列表信息,就要引入新的列表视图ListView,列表视图允许在页面上分行展示相似的数据列表。 列表视图新增的属性与方法如下 divider 指定分割线的图形 dividerHeight 指定分割线的高度 listSelecto

    2023年04月22日
    浏览(45)
  • 25. 【Android教程】列表控件 ListView

    在学习了 ScrollView 及 Adapter 两节内容之后,大家应该对 ListView 有了一些基本的了解,它是一个列表样式的 ViewGroup,将若干 item 按行排列。ListView 是一个很基本的控件也是 Android 中最重要的控件之一。它可以帮助我们完成多个 View 的垂直排列并支持滚动显示效果,而它比 Scr

    2024年04月17日
    浏览(45)
  • Android的UI开发——ListView

    效果如下: 新建fruit_xml文件,意为列表存放的格式。 MainActivity.java中代码 新建一个类Fruit 新建一个类FruitAdapter                                                                                                                                 用于将上下文、

    2024年02月03日
    浏览(44)
  • Android最常用的控件ListView(详解)

           在Android开发中,ListView是一个比较常用的控件。它以列表的形式 展示具体数据内容,并且能够根据数据的长度自适应屏幕显示。     1.布局界面 activity_main.xml 代码:    2.类文件 MainActivity.java 代码:    1.ArrayAdapter适配器 1、ArrayAdapter适用亍数组或数据ArrayList(动态数

    2023年04月09日
    浏览(45)
  • Android初学之android studio运行java/kotlin程序

    第一步骤: File — New — New Module ,然后弹出一个框,(左边)选择 Java or Kotlin Library ,(右边)编辑自己的图书馆名、包名、类名,选择 Java 一个语言,然后 Finish 如下图: 然后,就可以看见我新建的 java Library 了,如下图: 第二步骤:马上写个测试程序 看看能不能运行

    2024年02月11日
    浏览(55)
  • 【Android入门到项目实战--3.4】—— ListView控件的使用

    目录 一、ListView的简单用法 二、进一步优化ListView界面 三、提升ListView的效率(优化) 四、ListView的点击事件 本篇文章主要讲解最常用的控件之一:ListView的使用。         当我们的程序有大量的数据需要展示的时候,可以借助ListView实现。ListView允许用户上下滑动滚动屏

    2024年02月07日
    浏览(48)
  • Android、Android Studio 和 Gradle 是如何使用 Java 的

    可以肯定地说,每个人都知道 Android 使用 Java。然而,“使用 Java ”的含义范围相当大。因此,在本文中,我将介绍 Android 设备和我们用于 Android 开发的各种工具是如何使用 Java 平台的。 让我们从结论开始——下图显示了 Java 在 Android 生态系统中的作用: 使用 Java 编程语言编

    2024年02月10日
    浏览(46)
  • Android Studio Unsupported Java

    问题:升级 Android Studio Flamingo 出现如下报错信息 解决方法:File - Settings - Build, Execution, Deployment - Build Tools - Gradle 将 Gradle JDK 修改为本机安装的 JDK 版本即可,如: JDK-11.0.15

    2024年02月11日
    浏览(39)
  • Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

    ListView  是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很好滚动流畅是做不到的 所以这里就需要把这些信息利用多线程实现异步加载 实现这样功能的

    2024年02月16日
    浏览(55)
  • Android Studio中创建java项目

    1.创建普通的android工程 2.创建一个module 3.module类型选择java library 4.填写libary和class的名字 5.生成的工程如图所示 6.然后点击Run --- Edit Configurations... 选择Application选项 设置所需要的参数 选中myjavalib后点击OK。然后打开刚创建的lib的gradle 编辑gradle文件 点击运行按钮 控制台输出结

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包