android:ViewHolder模式

  1. ViewHolder holder = null;
  2. if(convertView == null){
  3. convertView = mInflater.inflate(R.layout.xxx null);
  4. holder = new ViewHolder();
  5. holder.tvXXX = (TextView)findViewById(R.id.xxx);
  6. //...一连串的findViewById
  7. }
  8. else{
  9. holder = (ViewHolder) convertView.getTag();
  10. }
  11. private static class ViewHolder{
  12. TextView tvXXX;
  13. //很多view的定义
  14. }

这么写一次还行,但问题是总有很多很多的ViewAdapter要这么写,每次都repeat,repeat,repeat  累啊。      所以,有这么一种简洁的写法分享给大家,先声明,从国外网站上看的,不是自己原创的,但确实很喜欢这个简洁的设计。

ViewHolder这么写(只提供一个静态方法,其实可以加一个私有构造函数防止外部实例化),代码很简单,看过就明白了

  1. public class ViewHolder {
  2. // I added a generic return type to reduce the casting noise in client code
  3. @SuppressWarnings("unchecked")
  4. public static <T extends View> T get(View view, int id) {
  5. SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
  6. if (viewHolder == null) {
  7. viewHolder = new SparseArray<View>();
  8. view.setTag(viewHolder);
  9. }
  10. View childView = viewHolder.get(id);
  11. if (childView == null) {
  12. childView = view.findViewById(id);
  13. viewHolder.put(id, childView);
  14. }
  15. return (T) childView;
  16. }
  17. }

在getView里这样

    1. @Override
    2. public View getView(int position, View convertView, ViewGroup parent) {
    3. if (convertView == null) {
    4. convertView = LayoutInflater.from(context)
    5. .inflate(R.layout.banana_phone, parent, false);
    6. }
    7. ImageView bananaView = ViewHolder.get(convertView, R.id.banana);
    8. TextView phoneView = ViewHolder.get(convertView, R.id.phone);
    9. BananaPhone bananaPhone = getItem(position);
    10. phoneView.setText(bananaPhone.getPhone());
    11. bananaView.setImageResource(bananaPhone.getBanana());
    12. return convertView;
    13. }
上一篇:Day08 - Ruby比一比:String的+=与concat串接


下一篇:appium+robotframework常见技巧总结