以前都是這樣一遍遍的 new ViewHolderide
private class LvAdapter extends BaseAdapter{ private ViewHolder holder; @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; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null){ holder = new ViewHolder(); convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main_item,null); holder.txt = (TextView)convertView.findViewById(R.id.txt); convertView.setTag(holder); } else{ holder = (ViewHolder) convertView.getTag(); } //TextView txt = ViewHolder.get(convertView,R.id.txt); holder.txt.setText(list.get(position)); return convertView; } private class ViewHolder{ TextView txt; } }
因此,有這麼一種簡潔的寫法分享給你們,先聲明,從國外網站上看的,不是本身原創的,但確實很喜歡這個簡潔的設計。優化
public class ViewHolder { public static <T extends View> T get(View view, int id) { SparseArray viewHolder = (SparseArray) view.getTag(); if (viewHolder == null) { viewHolder = new SparseArray(); view.setTag(viewHolder); } View childView = (View) viewHolder.get(id); if (childView == null) { childView = view.findViewById(id); viewHolder.put(id, childView); } return (T) childView; } }
private class LvAdapter extends BaseAdapter{ @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; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null){ convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main_item,null); } TextView txt = ViewHolder.get(convertView,R.id.txt); txt.setText(list.get(position)); return convertView; } }
值得注意的是SparseArray這個知識點,優化過的存儲integer和object鍵值對的HashMap網站