自定義適配器--ListView數據源的綁定

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章