热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我要来给ListView优化升升级

文本目录创建一个工程初始代码存在的问题在以上代码的基础上,开始对ListView进行优化创建一个类,可在Mactivity里面找到这些不能被内存回收的i

文本目录

  • 创建一个工程
    • 初始代码
    • 存在的问题
  • 在以上代码的基础上,开始对ListView进行优化
      • 创建一个类,可在Mactivity里面
      • 找到这些不能被内存回收的item的地址
      • 再看效果和资源占用情况
  • 完整代码
    • MainActivity. java
    • activity_main.xml
    • item.xml
    • Chats类


创建一个工程

初始代码

package com.c20200517.bin0527;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {ListView listView;//声明ListView//构造数据结构&#xff0c;用于存填充的数据List<Chats> lists&#61;new ArrayList();&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView&#61;findViewById(R.id.listView);//构造数据for(int i&#61;0;i<&#61;20;i&#43;&#43;){Chats chat&#61;new Chats();chat.title&#61;"标题"&#43;i;chat.content&#61;"内容"&#43;i;chat.butext&#61;"按钮"&#43;i;lists.add(chat);}listView.setAdapter(new MyAdapter());}public class MyAdapter extends BaseAdapter{&#64;Overridepublic int getCount() {//填充条目return lists.size();}&#64;Overridepublic View getView(int position, View convertView, ViewGroup parent) {//在ListView中加载item_layoutView view&#61;View.inflate(MainActivity.this,R.layout.item_layout,null);Chats chats&#61;lists.get(position);//获得控件&#xff0c;并填充数据TextView textView1&#61;view.findViewById(R.id.textView);TextView textView2&#61;view.findViewById(R.id.textView2);Button button &#61;view.findViewById(R.id.button);textView1.setText(chats.title);textView2.setText(chats.content);button.setText(chats.butext);return view;}&#64;Overridepublic Object getItem(int position) {return null;}&#64;Overridepublic long getItemId(int position) {return 0;}}
}

- 布局文件省略&#xff0c;初始效果如下

在这里插入图片描述

存在的问题

1. 如果ListView不去优化&#xff0c;滑倒屏幕以外的item没有回收&#xff0c;那么它所占用的资源依然没有释放&#xff0c;当要构造的条目更多的时候&#xff0c;资源不释放&#xff0c;新的条目又要新的资源&#xff0c;那么MEMORY软件运行所占内存资源越多。

- 滑动屏幕&#xff0c;查看监听器

在这里插入图片描述

2. 如果每个条目中还要加载图片资源的话&#xff0c;加载图片是非常耗时的&#xff0c;如果不优化&#xff0c;会给用户造成卡顿&#xff0c;运行慢的感觉。

在以上代码的基础上&#xff0c;开始对ListView进行优化

创建一个类&#xff0c;可在Mactivity里面

1、将item中的findviewbyid保存在一个类
2、需要findviewbyid直接去类里面拿


public class MyViewHolder{TextView textView1;TextView textView2;Button button;}

找到这些不能被内存回收的item的地址

- 在getView()里面改变为以下代码

//getView()每出现一个item都会调用//找到这些不能被内存回收的item的地址//convertView表示系统中没有可回收的item&#xff0c;如果有就返回item的内存地址&#xff0c;没有返回空&#64;Overridepublic View getView(int position, View convertView, ViewGroup parent) {Chats chats&#61;lists.get(position);MyViewHolder myViewHolder&#61;null;//屏幕开始时构造的几条itemif(convertView&#61;&#61;null){convertView&#61; LayoutInflater.from(MainActivity.this).inflate(R.layout.item_layout,parent,false);myViewHolder&#61;new MyViewHolder();myViewHolder.textView1&#61;convertView.findViewById(R.id.textView);myViewHolder.textView2&#61;convertView.findViewById(R.id.textView2);myViewHolder.button&#61;convertView.findViewById(R.id.button);//MyViewHolder作为convertView的一个成员变量convertView.setTag(myViewHolder);}else{//把作为convertView的成员变量MyViewHolder取出来myViewHolder&#61;(MyViewHolder) convertView.getTag();}//获得控件&#xff0c;并填充数据myViewHolder.textView1.setText(chats.title);myViewHolder.textView2.setText(chats.content);myViewHolder.button.setText(chats.butext);return convertView;}

再看效果和资源占用情况

- 效果和未优化一样

在这里插入图片描述

- 但资源占用问题却得到优化
在这里插入图片描述

完整代码

MainActivity. java

package com.c20200517.bin0527;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {ListView listView;//声明ListView//构造数据结构&#xff0c;用于存填充的数据List<Chats> lists&#61;new ArrayList();&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView&#61;findViewById(R.id.listView);//构造数据for(int i&#61;0;i<&#61;100;i&#43;&#43;){Chats chat&#61;new Chats();chat.title&#61;"标题"&#43;i;chat.content&#61;"内容"&#43;i;chat.butext&#61;"按钮"&#43;i;lists.add(chat);}listView.setAdapter(new MyAdapter());}public class MyAdapter extends BaseAdapter{&#64;Overridepublic int getCount() {//填充条目return lists.size();}//getView()每出现一个item都会调用//找到这些不能被内存回收的item的地址//convertView表示系统中没有可回收的item&#xff0c;如果有就返回item的内存地址&#xff0c;没有返回空&#64;Overridepublic View getView(int position, View convertView, ViewGroup parent) {//在ListView中加载item_layout// View view&#61;View.inflate(MainActivity.this,R.layout.item_layout,null);Chats chats&#61;lists.get(position);MyViewHolder myViewHolder&#61;null;//屏幕开始时构造的几条itemif(convertView&#61;&#61;null){convertView&#61; LayoutInflater.from(MainActivity.this).inflate(R.layout.item_layout,parent,false);myViewHolder&#61;new MyViewHolder();myViewHolder.textView1&#61;convertView.findViewById(R.id.textView);myViewHolder.textView2&#61;convertView.findViewById(R.id.textView2);myViewHolder.button&#61;convertView.findViewById(R.id.button);convertView.setTag(myViewHolder);//MyViewHolder作为convertView的一个成员变量}else{myViewHolder&#61;(MyViewHolder) convertView.getTag();//把作为convertView的成员变量MyViewHolder取出来}myViewHolder.textView1.setText(chats.title);myViewHolder.textView2.setText(chats.content);myViewHolder.button.setText(chats.butext);//获得控件&#xff0c;并填充数据return convertView;}&#64;Overridepublic Object getItem(int position) {return null;}&#64;Overridepublic long getItemId(int position) {return 0;}}//1、将item中的findviewbyid保存在一个类//2、需要findviewbyid直接去类里面拿public class MyViewHolder{TextView textView1;TextView textView2;Button button;}
}

activity_main.xml

<?xml version&#61;"1.0" encoding&#61;"utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android&#61;"http://schemas.android.com/apk/res/android"xmlns:app&#61;"http://schemas.android.com/apk/res-auto"xmlns:tools&#61;"http://schemas.android.com/tools"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"tools:context&#61;".MainActivity"><ListViewandroid:id&#61;"&#64;&#43;id/listView"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"app:layout_constraintBottom_toBottomOf&#61;"parent"app:layout_constraintEnd_toEndOf&#61;"parent"app:layout_constraintStart_toStartOf&#61;"parent"app:layout_constraintTop_toTopOf&#61;"parent"></ListView></androidx.constraintlayout.widget.ConstraintLayout>

item.xml

<?xml version&#61;"1.0" encoding&#61;"utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android&#61;"http://schemas.android.com/apk/res/android"xmlns:app&#61;"http://schemas.android.com/apk/res-auto"xmlns:tools&#61;"http://schemas.android.com/tools"android:id&#61;"&#64;&#43;id/item"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"><TextViewandroid:id&#61;"&#64;&#43;id/textView"android:layout_width&#61;"wrap_content"android:layout_height&#61;"wrap_content"android:layout_marginStart&#61;"24dp"android:layout_marginLeft&#61;"24dp"android:layout_marginTop&#61;"24dp"android:layout_weight&#61;"1"android:text&#61;"TextView"app:layout_constraintStart_toStartOf&#61;"parent"app:layout_constraintTop_toTopOf&#61;"parent" /><TextViewandroid:id&#61;"&#64;&#43;id/textView2"android:layout_width&#61;"wrap_content"android:layout_height&#61;"wrap_content"android:layout_marginTop&#61;"32dp"android:text&#61;"TextView"app:layout_constraintEnd_toEndOf&#61;"&#64;&#43;id/textView"app:layout_constraintStart_toStartOf&#61;"&#64;&#43;id/textView"app:layout_constraintTop_toBottomOf&#61;"&#64;&#43;id/textView" /><Buttonandroid:id&#61;"&#64;&#43;id/button"android:layout_width&#61;"wrap_content"android:layout_height&#61;"wrap_content"android:layout_marginEnd&#61;"100dp"android:layout_marginRight&#61;"32dp"android:text&#61;"Button"app:layout_constraintBottom_toBottomOf&#61;"&#64;&#43;id/textView2"app:layout_constraintEnd_toEndOf&#61;"parent"app:layout_constraintTop_toTopOf&#61;"&#64;&#43;id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>

Chats类


package com.c20200517.bin0527;
public class Chats {String title;String content;String butext;
}


推荐阅读
author-avatar
你妈咪叫你吃饭呢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有