博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ListView控件性能提升
阅读量:4289 次
发布时间:2019-05-27

本文共 4655 字,大约阅读时间需要 15 分钟。

       ListView控件是 Android 中最常用的控件之一,几乎所有的应用程序都会用到它。比如淘宝app中,有很多的商家,每个商家还有很多的商品,但是手机屏幕很小,不可能一下子将所有的商家和商品都展示出来,所以就需要使用 ListView来实现。这里我就直接上代码了,具体的代码解释会在程序中注释,在页面的最下面有下载该demo的链接地址。

效果图:

activity_main.xml中的代码:

代码解释:

设置分隔线颜色:android:divider="#556B2F"

设置分割线高度:android:dividerHeight="10dp"

Person.java类中的部分代码:

public class Person {		private int imgId ;//头像	private String name ;//姓名	private String status ;//状态信息:在线,离线	private String info ; //签名	private String date ;//日期       get和set方法省略...}

PersonAdapter.java中的代码:

public class PersonAdapter extends ArrayAdapter
{ /** * ListView 子项布局的id */ private int rescourceId; /** * 上下文 */ private Context context; public PersonAdapter(Context context, int textViewResourceId, List
objects) { super(context, textViewResourceId, objects); rescourceId = textViewResourceId; this.context = context; } /** * 一、getView()方法在每个子项被滚动到屏幕内的时候 会被调用。 * 二、 提升性能: * 1、当 convertView为空 的时候, 创建一个ViewHolder对象, 并将控件的实例都存放在 * ViewHolder 里, 然后调用 View 的 setTag()方法,将ViewHolder 对象存储在 View 中。 * 2、当 convertView 不为空的时候则调用 View的 getTag()方法, 把 ViewHolder 重新取出。 * 这样所有控件的实例都缓存在了 ViewHolder 里,就没有必要每次都通过 findViewById()方法来获取控件实例了。 * 这样会使ListView的运行效率获得很大的提高 */ @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view = null; final ViewHolder viewHolder; /** * 通过 getItem()方法获取当前项的Person实例 */ Person person = getItem(position); if (convertView == null) { /** * 如果 convertView 为空,则使用 LayoutInflater 去动态加载我们传入的子项布局, */ view = LayoutInflater.from(context).inflate(rescourceId, null); viewHolder = new ViewHolder(); /** * 调用 View 的 findViewById()方法分别 获取到页面的控件对象实例 */ viewHolder.imgView = (ImageView) view.findViewById(R.id.imageView); viewHolder.nameView = (TextView) view.findViewById(R.id.nameId); viewHolder.dateView = (TextView) view.findViewById(R.id.dateId); viewHolder.statusView = (TextView) view.findViewById(R.id.statusId); viewHolder.infoView = (TextView) view.findViewById(R.id.infoId); /** * 将ViewHolder 存储在View 中 , */ view.setTag(viewHolder); } else { /** * 1、如果不为空则直接对 convertView进行重用。 * 2、可以大大提高ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。 */ view = convertView; /** * 从view中重新获取ViewHolder */ viewHolder = (ViewHolder) view.getTag(); } /** * 1、从viewHolder中取出我们缓存的子项布局中的各个控件对象, * 2、将此次加载的Person实例中的数据加载到当前进入屏幕的子项布局中的对应控件上, * 3、完成数据到页面的展示 */ viewHolder.imgView.setImageResource(person.getImgId()); viewHolder.nameView.setText(person.getName()); viewHolder.dateView.setText(person.getDate()); viewHolder.statusView.setText(person.getStatus()); viewHolder.infoView.setText(person.getInfo()); viewHolder.imgView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(context, "修改 "+viewHolder.nameView.getText()+"的头像", 0).show() ; } }) ; /** * viewHolder存储在view中,填充数据完成之后,我们把view返回,这个view中已经是填充完数据之后的view了 * 返回布局 */ return view; } /** * 内部类 ViewHolder,用于对控件的实例进行缓存 */ class ViewHolder { ImageView imgView; TextView nameView, dateView, statusView, infoView; }}

item.xml中的代码:

MainActivity.java中的代码:

public class MainActivity extends Activity {	private ListView listView;	List
datas = new ArrayList
(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); /** * 初始化数据 */ initDatas() ; /** * 创建PersonAdapter对象,将子项布局id,和数据源传递进去 */ PersonAdapter adapter = new PersonAdapter(MainActivity.this, R.layout.item, datas); /** * 将PersonAdapter作为适配器传递给 了 ListView。 */ listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView
parent, View view, int position, long id) { // TODO Auto-generated method stub Person person = datas.get(position); Toast.makeText(MainActivity.this, "您点击了 "+person.getName()+" 这项", 0).show(); } }); } SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 /** * 获得数据 */ private void initDatas() { for (int i = 1; i < 15; i++) { Person person = new Person(); person.setImgId(R.drawable.img1); person.setName("司令" + i); person.setStatus("[在线]"); person.setInfo("我们的部队今日就要去南海了"); person.setDate(df.format(new Date())); datas.add(person); } }}

项目下载地址:

你可能感兴趣的文章
自己编写的计算器
查看>>
视频物体检测
查看>>
Tomcat启动遇到的问题
查看>>
Gradle-gradlew
查看>>
grpc-整合gradle与代码生成
查看>>
grpc-gradle与grpc流程完美整合(3)
查看>>
设计模式-装饰模式(Decorator)
查看>>
git-子模块submodule
查看>>
设计模式-策略模式(Strategy)
查看>>
设计模式-观察者模式(Observer)
查看>>
java浅拷贝(shallow clone)与深拷贝(deep clone)
查看>>
Elasticsearch-terms搜索及结果优化
查看>>
Elasticsearch-对一个field进行多值全文本搜索
查看>>
Elasticsearch-best_fileds和most_fields策略分析以及cross-fields弊端的解决
查看>>
Elasticsearch-近似搜索
查看>>
Elasticsearch-前缀、通配符、正则、模糊搜索详解
查看>>
Elasticsearch-搜索推荐
查看>>
java-nio之Selector组件
查看>>
java-编码解密
查看>>
netty源码分析之-Future、ChannelFuture与ChannelPromise详解(3)
查看>>