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