ListView 利用自定义的适配器,使用缓存机制优化
首先,ListView完整写法的三个步骤:
1、初始化数据源
2、定义适配器
3、加载适配器
一、数据源
1、定义数组保存已经准备好的数据源
2、定义List之后装载数据源 其中,可通过自定义泛型来自定义数据源的类型
private List<ItemBean> dataList; //装载数据源
//一个ListView 的item项所包含的东西--自定义的泛型类 public class ItemBean { public int itemImageId; //一个Item项所包含的的数据 public String itemName; //可在其他类中引用 public ItemBean(int itemImageId, String itemName) { this.itemImageId = itemImageId; this.itemName = itemName; } }
//初始化数据源 private void initData() { dataList=new ArrayList<>(); for(int i=0;i<iconImage_res.length;i++){ dataList.add(new ItemBean(iconImage_res[i],iconName_res[i])); //数据源的数组 //将每一个Item添加进List } }二、自定义适配器
1、新建类,继承BaseAdapter ,实现方法
构造方法:
public MyAdapter(List<ItemBean> dataList, Context context) { layoutInflater=LayoutInflater.from(context); this.dataList = dataList; }2、getView() 方法使用缓存机制--使用ViewHolder和 convertView
新建内部类ViewHolder,将控件作为成员属性
private class ViewHolder { private ImageView itemImage; private TextView itemName; //一个ListView项的名称 }public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder viewHolder=new ViewHolder(); //装载id的中介 if(convertView==null){ //将二者绑定 convertView=layoutInflater.inflate(R.layout.lv_item,null); viewHolder.itemImage= (ImageView) convertView.findViewById(R.id.iv_icon); //用来装载控件,这样可以不用每次去findId viewHolder.itemName= (TextView) convertView.findViewById(R.id.tv_iconName); convertView.setTag(viewHolder); }else { viewHolder= (ViewHolder) convertView.getTag(); } ItemBean bean=dataList.get(position); //通过ViewHolder找到对应控件 viewHolder.itemImage.setImageResource(bean.itemImageId); viewHolder.itemName.setText(bean.itemName); return convertView;}
三、加载适配器,添加点击事件
实例化ListView和adapter ,实现监听接口 onItemClickListener
例子如下:
package codefirst.listview_test; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; /** * Created by cheng on 2017/1/25. */ //自定义的适配器 public class MyAdapter extends BaseAdapter { private List dataList; //装载数据源 //private Context context; //getView()方法的布局装载器需要用到 private LayoutInflater layoutInflater; //布局装载器 public MyAdapter(List dataList, Context context) { this.layoutInflater=LayoutInflater.from(context); this.dataList = dataList; } @Override public int getCount() { return dataList.size(); } //对象 @Override public Object getItem(int position) { return dataList.get(position); } @Override public long getItemId(int postion) { return postion; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder viewHolder=new ViewHolder(); //装载id的中介 if(convertView==null){ //将二者绑定 convertView=layoutInflater.inflate(R.layout.lv_item,null); viewHolder.itemImage= (ImageView) convertView.findViewById(R.id.iv_icon); //用来装载控件,这样可以不用每次去findId viewHolder.itemName= (TextView) convertView.findViewById(R.id.tv_iconName); convertView.setTag(viewHolder); }else { viewHolder= (ViewHolder) convertView.getTag(); } ItemBean bean=dataList.get(position); //通过ViewHolder找到对应控件 viewHolder.itemImage.setImageResource(bean.itemImageId); viewHolder.itemName.setText(bean.itemName); return convertView; //findID没有再用一个中介去保存 /* if(convertView==null){ convertView=layoutInflater.inflate(R.layout.lv_item,null); //缓存机制 ItemBean bean=dataList.get(position); //一个项 ImageView itemImage= (ImageView) convertView.findViewById(R.id.iv_icon); TextView itemName= (TextView) convertView.findViewById(R.id.tv_iconName); itemImage.setImageResource(bean.itemImageId); itemName.setText(bean.itemName); }*/ //没有用到缓存 /* View view=layoutInflater.inflate(R.layout.lv_item,null); /* //将一个布局文件转化为一个view ItemBean bean=dataList.get(position); //一个item项的内容 ImageView imageView= (ImageView) view.findViewById(R.id.iv_icon); TextView textView= (TextView) view.findViewById(R.id.tv_iconName); imageView.setImageResource(bean.itemImageId); //对象调用成员属性 textView.setText(bean.itemName); return view;*/ //return convertView; } //自定义泛型----内部类 private class ViewHolder { private ImageView itemImage; private TextView itemName; //一个ListView项的名称 } }package codefirst.listview_test; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private String iconName_res[]={"通讯录","漂亮","日历","相机","闹钟","游戏", "短信","音乐","河流","设置","气球","天气","地图","视频"}; //名称数据源 private int iconImage_res[]={R.mipmap.address_book,R.mipmap.beau,R.mipmap.calendar, R.mipmap.camera,R.mipmap.clock,R.mipmap.games_control,R.mipmap.messenger, R.mipmap.ringtone,R.mipmap.riven,R.mipmap.settings,R.mipmap.speech_balloon, R.mipmap.weather,R.mipmap.world,R.mipmap.youtube}; private List dataList; //装载数据源 private MyAdapter adapter; private ListView listItem_lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initAdapter(); listItem_lv= (ListView) findViewById(R.id.lv_main); listItem_lv.setAdapter(adapter); } private void initAdapter() { adapter=new MyAdapter(dataList,this); } //初始化数据源 private void initData() { dataList=new ArrayList<>(); for(int i=0;i