ViewHolder优化ListView

viewholder_item.xml  子布局文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent">
 6
 7
 8
 9     <ImageView
10         android:id="@+id/iv"
11         android:layout_width="wrap_content"
12         android:layout_height="wrap_content" />
13
14     <TextView
15         android:id="@+id/tv"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content" />
18 </LinearLayout>

ViewHolderAdapter.java

 1 package sowell.oracle.com.listviewholder;
 2
 3 import android.content.Context;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.BaseAdapter;
 8 import android.widget.ImageView;
 9 import android.widget.TextView;
10
11 import java.util.List;
12
13 /**
14  * Created by 94965 on 2017/11/11.
15  */
16
17 public class ViewHolderAdapter extends BaseAdapter {
18
19     private List<String> mData;             //储存数据
20     private LayoutInflater mInflater;      //实例化布局
21
22     public ViewHolderAdapter(Context context,List<String> data){
23         super();
24         this.mData=data;
25         mInflater=LayoutInflater.from(context);
26     }
27
28     @Override
29     public int getCount() {
30         return mData.size();
31     }
32
33     @Override
34     public Object getItem(int position) {
35         return mData.get(position);
36     }
37
38     @Override
39     public long getItemId(int position) {
40         return position;
41     }
42
43     @Override
44     public View getView(int position, View convertView, ViewGroup parent) {
45         ViewHolder holder=null;
46         //判断是否缓存
47         if(convertView==null){
48             holder=new ViewHolder();
49             //通过LayoutInflater实例化布局
50             convertView=mInflater.inflate(R.layout.viewholder_item,null);
51             holder.img=(ImageView)convertView.findViewById(R.id.iv);
52             holder.title=(TextView)convertView.findViewById(R.id.tv);
53             convertView.setTag(holder);
54         }else {
55             //通过tag找到缓存‘的布局
56             holder=(ViewHolder)convertView.getTag();
57         }
58
59         //设置布局中控件要显示的视图
60         holder.img.setBackgroundResource(R.mipmap.ic_launcher);
61         holder.title.setText(mData.get(position));
62         return convertView;
63     }
64
65
66
67     public final class ViewHolder{
68         public ImageView img;
69         public TextView title;
70     }
71 }

activity.xml 总布局文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="wrap_content"
 6     android:orientation="horizontal"
 7     tools:context="sowell.oracle.com.listviewholder.MainActivity">
 8
 9     <ListView
10         android:id="@+id/lv"
11         android:layout_width="match_parent"
12         android:layout_height="match_parent"></ListView>
13
14
15 </LinearLayout>

MainActivity.java

 1 package sowell.oracle.com.listviewholder;
 2
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.os.Bundle;
 5 import android.util.Log;
 6 import android.widget.ListView;
 7 import android.widget.Toast;
 8
 9 import java.util.ArrayList;
10 import java.util.List;
11
12 public class MainActivity extends AppCompatActivity {
13
14     public ListView listView;
15     public ViewHolderAdapter adapter;
16     public List<String> list;
17     public String string;
18
19
20     public void init(){
21
22         list=new ArrayList<String>();
23         for(int i=0;i<=20;i++)
24         {
25             string=""+i;
26             list.add(string);
27         }
28         adapter=new ViewHolderAdapter(this,list);
29         listView=(ListView)findViewById(R.id.lv);
30         listView.setAdapter(adapter);
31     }
32
33
34     @Override
35     protected void onCreate(Bundle savedInstanceState) {
36         super.onCreate(savedInstanceState);
37         setContentView(R.layout.activity_main);
38         init();
39     }
40 }
时间: 2024-10-13 09:14:24

ViewHolder优化ListView的相关文章

Android - ViewHolder优化ListView

在Android开发中, ListView是重要的组件, 它以列表形式根据数据的长度, 自适应展示具体内容. 用户可以自由的定义ListView每一列的布局. 当listview有大量数据需要加载的时候, 会占据内存, 影响性能. 这时候就需要按需填充, 并重新使用View, 减少对象的创建. ListView加载数据都是在getView()方法中进行. 同时, 需要自定义ListView重写ListAdapter: 如BaseAdapter, SimpleAdapter, CursorAdap

理解用setTag 和 Viewholder 来优化listView

在说 setTag和getTag之前,我们先说下 Viewholder,它不是Android开发固定的API,而是谷歌Demo中推荐的设计方法.Viewholder对象它一般包括listview子项里所有的组件,convertView是空的,在Viewholder里存储对列表子项每个组件的id应用,通过setTag方法,把这个带有view引用的对象附加在View上,如此,当listView更新的时候,就不用再次去重复寻找引用,并且强制转换等工作,findViewById(R.id.img):通过

android问题及其解决-优化listView卡顿和怎样禁用ListView的fling

问题解决-优化listView卡顿和怎样禁用ListView的fling 前戏非常长,转载请保留出处:http://blog.csdn.net/u012123160/article/details/47720257 问题产生 这算是刚到实习公司接触到的第一个任务.公司某一产品中某个界面的listView高速滑动会有卡顿的现象发生,我的任务就是解决它. 产生原因分析 我一開始的想法比較简单.可能是listview的优化没有做到位,比如convertView的复用.viewHolder的使用等等基础

常用的优化ListView效率的方法及其原理

在Android开发中,ListView的使用频率及其高,可以说99%的应用中你都可以看到他的身影. 在日常的开发工作中,我们一般会通过以下方法来优化ListView的效率: 1.复用getView方法中的convertView 一个ListView可能有很多Item,但是限于手机屏幕非常有限,所以只能显示很少的一部分Item,比如能显示10个,那么Android会在ListView中保存多余10个的Item, 溢出屏幕的Item会被回收到一个池子中,以备后用,那么就不用从新new出View对象

Ace教你一步一步做Android新闻客户端(五) 优化Listview

今天写存货了 调试一些动画参数花了些时间 ,嘿嘿存货不多了就没法做教程了,今天来教大家优化listview,等下我把代码编辑下 这次代码有些多 所以我把条理给大家理清楚.思路就是把加载图片的权利交给OnScrollListener . 1 首先来到 NewsAdapter这个类 ,我们给他实现了一个 AbsListView.OnScrollListener 这个接口,这个接口有两个方法: @Override public void onScrollStateChanged(AbsListView

android问题及其解决-优化listView卡顿和如何禁用ListView的fling

问题解决-优化listView卡顿和如何禁用ListView的fling 前戏很长 问题产生 这算是刚到实习公司接触到的第一个任务.公司某一产品中某个界面的listView快速滑动会有卡顿的现象发生,我的任务就是解决它. 产生原因分析 我一开始的想法比较简单,可能是listview的优化没有做到位,例如convertView的复用.viewHolder的使用等等基础的优化措施,然并卵.好长时间后终于找到了问题发生的相关代码...经过在可疑语句上(onTouchEvent方法中的几个case.on

android-----带你一步一步优化ListView(一)

ListView作为android中最常使用的控件,可以以条目的形式显示大量的数据,经常被用于显示最近联系人列表,对于每一个 Item,均要求adapter的getView方法返回一个View,因此ListView的实现是离不开Adapter的,如果以MVC的思想来看ListView的话,ListView的显示相当于V,Adapter部分相当于C,而数据部分就相当于M了,接下来的几篇博客计划对ListView自己所了解的一些优化措施总结一下,希望能够帮助到大家: 先来看看如果我们不使用任何优化措

android-----带你一步一步优化ListView(三)

前两篇我们介绍了一般的优化ListView方法以及DiskLruCache优化ListView,见android-----带你一步一步优化ListView(一)和android-----带你一步一步优化ListView(二),这一篇我们将从内存缓存的角度来完成ListView的优化,使用的是LruCache,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除,并没有一个固定的缓存大小是符合所有应用程序的,

android-----带你一步一步优化ListView(二)

上一篇介绍了通常我们优化ListView的方式,但是这点对于要加载大量图片的ListView来说显然是不够的,因为我们知道要想获取一张图片不管是本地的还是网络的,其性能上均没有从内存中获取快,所以为了提升用户的体验度,对于加载图片的ListView,通常我们会通过缓存做以下优化: 基本思想: (1)如果想要加载图片,首先先去内存缓存中查看是否有图片(内存缓存) (2)如果内存缓存中没有,就会去本地SD卡上查找是否存在(SD卡缓存) (3)如果本地SD卡上也没有的话,则会去网络下载了,下载完成之后