Chinaunix首页 | 论坛 | 博客
  • 博客访问: 417566
  • 博文数量: 121
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1393
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-11 12:17
个人简介

www.vibexie.com vibexie@qq.com

文章分类

全部博文(121)

文章存档

2015年(55)

2014年(66)

我的朋友

分类: Android平台

2015-03-23 15:49:45

1.优化的关键在于对已绘制list的缓存,已绘制的list不用再重新绘制
2.将list保存到ViewHolder对象中

缺陷:

当我们的ListView中填充的item有多种形式时,比如微博中,有的item中包含图片,有的item包含视频,那么必然的,我们需要用到2种item的布局方式,此时如果只是单纯判断convert是否存在,会造成回收的view不符合你当前需要的布局,而类似转换失败出错退出
这里要提到Adapter中的另外2个方法:

public int getItemViewType(int position) {}
public int getViewTypeCount() {}

对于这两个方法,可以参考:http://blog.csdn.net/yzx41099296/article/details/8100986

MainActivity.java

  1. package cn.com.xiebiao.listview;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.ArrayAdapter;
  9. import android.widget.BaseAdapter;
  10. import android.widget.Button;
  11. import android.widget.ListView;
  12. import android.widget.TextView;
  13. import android.widget.Toast;

  14. import java.util.ArrayList;
  15. import java.util.List;


  16. public class MainActivity extends Activity {
  17.     private ListView listView;
  18.     private ArrayAdapter<String> adapter;

  19.     @Override
  20.     protected void onCreate(Bundle savedInstanceState) {
  21.         super.onCreate(savedInstanceState);
  22.         setContentView(R.layout.activity_main);
  23.         listView=(ListView)this.findViewById(R.id.listView);
  24.         MyAdapter myAdapter=new MyAdapter(this);
  25.         listView.setAdapter(myAdapter);

  26.     }

  27.     class MyAdapter extends BaseAdapter{
  28.         private ViewHolder viewHolder;
  29.         private List<String> list;
  30.         private LayoutInflater layoutInflater;

  31.         MyAdapter(Context context){
  32.             this.list=getResource();
  33.             //获取context的布局填充器
  34.             this.layoutInflater=LayoutInflater.from(context);
  35.         }

  36.         @Override
  37.         public int getCount() {
  38.             System.out.println("--->>getCount中size="+list.size());
  39.             return list.size();
  40.         }

  41.         @Override
  42.         public Object getItem(int i) {
  43.             System.out.println("--->>getItem中i="+i);
  44.             return i;
  45.         }

  46.         @Override
  47.         public long getItemId(int i) {
  48.             System.out.println("--->>getItemID中i="+i);
  49.             return i;
  50.         }

  51.         @Override
  52.         public View getView(final int i, View view, ViewGroup viewGroup) {
  53.             System.out.println("--->>getView中i="+i);

  54.             //优化一:判断view是否已经绘制,已经绘制的话就不用重性绘制,关键的优化
  55.             //优化二:通过ViewHolder对象,可以省去已绘制对象findViewById()的系统资源消耗
  56.             if(view==null){
  57.                 view=layoutInflater.inflate(R.layout.list,null);
  58.                 viewHolder=new ViewHolder();
  59.                 viewHolder.textView=(TextView)view.findViewById(R.id.textView);
  60.                 viewHolder.button=(Button)view.findViewById(R.id.button);
  61.                 view.setTag(viewHolder);//保存ViewHolder对象
  62.             }else {
  63.                 viewHolder=(ViewHolder)view.getTag();//取出ViewHolder对象
  64.             }

  65.             viewHolder.textView.setText(list.get(i));
  66.             viewHolder.button.setText("Button"+i);

  67.             //为button添加点击事件
  68.             viewHolder.button.setOnClickListener(new View.OnClickListener() {
  69.                 @Override
  70.                 public void onClick(View view) {
  71.                     Toast.makeText(MainActivity.this,"第"+i+"个button",Toast.LENGTH_SHORT).show();
  72.                 }
  73.             });

  74.             return view;
  75.         }
  76.     }

  77.     //获取资源
  78.     public List<String> getResource(){
  79.         List<String> list=new ArrayList<String>();
  80.         for(int i=0;i<30;i++){
  81.             list.add("xiebiao "+i);
  82.         }
  83.         return list;
  84.     }

  85.     //用户持有list内部控件的类
  86.     public final class ViewHolder{
  87.         public TextView textView;
  88.         public Button button;
  89.     }
  90. }

list.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android=""
  3.     android:layout_width="match_parent" android:layout_height="wrap_content">

  4.     <TextView
  5.         android:layout_width="wrap_content"
  6.         android:layout_height="wrap_content"
  7.         android:text="New Text"
  8.         android:textSize="30sp"
  9.         android:id="@+id/textView" />

  10.     <Button
  11.         android:layout_width="wrap_content"
  12.         android:layout_height="wrap_content"
  13.         android:text="New Button"
  14.         android:textSize="30sp"
  15.         android:id="@+id/button" />

  16. </LinearLayout>


activity_main.xml

  1. <RelativeLayout xmlns:android=""
  2.     xmlns:tools="" android:layout_width="match_parent"
  3.     android:layout_height="match_parent">

  4.     <ListView
  5.         android:layout_width="wrap_content"
  6.         android:layout_height="match_parent"
  7.         android:id="@+id/listView"
  8.         android:layout_alignParentTop="true"
  9.         android:layout_centerHorizontal="true"/>
  10. </RelativeLayout>


阅读(1312) | 评论(0) | 转发(0) |
0

上一篇:Android LayoutInflater

下一篇:java设计模式

给主人留下些什么吧!~~