初探使用繼承BaseAdapter的自定義adapter去適配ListView
阿新 • • 發佈:2018-12-11
要做什麼:在一個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; } }