ViewHolder优化ListView

Posted 郑哲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于ViewHolder优化ListView的主要内容,如果未能解决你的问题,请参考以下文章

ListView优化的几点建议

ListView性能优化——convertView&viewHolder

listview的ViewHolder优化

ViewHolder优化ListView

Android之ListView性能优化——使用ConvertView和ViewHolder

listview加载性能优化ViewHolder