1. 程式人生 > >初探使用繼承BaseAdapter的自定義adapter去適配ListView

初探使用繼承BaseAdapter的自定義adapter去適配ListView

要做什麼:在一個activity中展示一個ListView柴犬列表,包含imageView和一個TextView

需要準備:

1、在哪個介面展示ListView,即一個activity

2、一個繼承了BaseAdapter的子類dogAdapter

3、一個Dogs實體類

4、item的佈局(一個item中包含了一個imageView和一個TextView)

重點在於介面卡dogAdapter:

定義引數:上下文Context、int型別的佈局資源、資料(List<dog>);用來接收呼叫構造器傳進來的引數

建構函式:將引數傳進來,帶有上下文Context、item佈局資源id、資料(即要展示的柴犬列表)

覆寫4個方法:getCount、getItem、getItemId、getView

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

重點在於getView:

沒有優化的基礎版:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
//通過方法LayoutInflater.from(context)構建出一個LayoutInflater物件,然後呼叫inflate動態載入一個佈局
//inflate方法裡有3個引數:依次是item的佈局、父佈局、最後一個boolean是表明不讓這個view新增父佈局
    convertView = LayoutInflater.from(context).inflate(R.layout.dogitem,parent,false);
//定義imageView和textView,對應的是item的佈局控制元件id
//item佈局中的
    ImageView imageView = convertView.findViewById(R.id.IV);
    TextView textView = convertView.findViewById(R.id.TV);
    imageView.setImageResource(list.get(position).getImageId());
    textView.setText(list.get(position).getName());
    return convertView;
}

============================================================================

做過兩處優化的版本:

①已載入過的item佈局儲存下來,在下一次展示時直接取,而不再調多一次inflate

②將佈局控制元件快取,在下一次展示時不再調findViewById

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        ViewHolder viewHolder;
        if(convertView == null){
    //當convertView為空時,只調一次inflate去取佈局?
            view = LayoutInflater.from(context).inflate(R.layout.dogitem,parent,false);
    //例項viewHolder,傳入ImageView、textView
            viewHolder = new ViewHolder();
            viewHolder.ImageView = view.findViewById(R.id.IV);
            viewHolder.textView = view.findViewById(R.id.TV);
    //view.setTag(viewHolder);快取
            view.setTag(viewHolder);
        }
        else {
            view = convertView;
    //getTag();取出
            viewHolder = (ViewHolder)view.getTag();
        }
    //list中的第get(position)個的名字getName()
        viewHolder.textView.setText(list.get(position).getName());
        viewHolder.ImageView.setImageResource(list.get(position).getImageId());
        return view;
    }

    //當螢幕中只顯示7個item時,顯示第1~7個item,每一個item都呼叫了findViewById,此時看不到第8、9個item
    //往下滑動到底,顯示第3~9個item,此時第8、9個item都呼叫了findViewById,此時看不到第1、2個item
    //再往上滑動到頂,顯示第1~7個item,此時第1、2個item又再一次呼叫了findViewById,此時看不到第8、9個item
    //這個類用來快取資源;
    class ViewHolder{

        ImageView ImageView;
        TextView textView;
    }
}