以前都是这样一遍遍的 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网站