文本目录
- 创建一个工程
- 在以上代码的基础上,开始对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;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) {View view&#61;View.inflate(MainActivity.this,R.layout.item_layout,null);Chats chats&#61;lists.get(position);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()里面改变为以下代码
&#64;Overridepublic View getView(int position, View convertView, ViewGroup parent) {Chats chats&#61;lists.get(position);MyViewHolder myViewHolder&#61;null;if(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);}else{myViewHolder&#61;(MyViewHolder) convertView.getTag();}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;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();}&#64;Overridepublic View getView(int position, View convertView, ViewGroup parent) {Chats chats&#61;lists.get(position);MyViewHolder myViewHolder&#61;null;if(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);}else{myViewHolder&#61;(MyViewHolder) convertView.getTag();}myViewHolder.textView1.setText(chats.title);myViewHolder.textView2.setText(chats.content);myViewHolder.button.setText(chats.butext);return convertView;}&#64;Overridepublic Object getItem(int position) {return null;}&#64;Overridepublic long getItemId(int position) {return 0;}}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;
}