案例:ListView中checkbox錯位問題

一、使用viewHolder後出現重複html

一、現象
   ListView中,當前點擊的那行,設置爲紅色。往下滾動,發現隔11行或12行的那行也會變紅色,可是你並無點過它。
二、緣由
  主要的問題在於自定義的Adapter中的getView()方法。通常咱們會這樣寫:
    public View getView(int position, View convertView, ViewGroup parent) { 
        ZuJian zuJian = null; 
        if(convertView==null){ 
            zuJian = new ZuJian(); 
            // 獲取組件佈局 
            convertView = layoutInflater.inflate(R.layout.vlist2, null); 
            zuJian.imageView = (ImageView) convertView.findViewById(R.id.image); 
            zuJian.titleView = (TextView) convertView.findViewById(R.id.title); 
            zuJian.infoView = (TextView) convertView.findViewById(R.id.info); 
            zuJian.button = (Button) convertView.findViewById(R.id.view_btn); 
            // 這裏要注意,是使用的tag來存儲數據的。 
            convertView.setTag(zuJian); 
        } 
        else { 
            zuJian = (ZuJian) convertView.getTag(); 
        } 
   }
這樣寫的話,就會有問題了。由於咱們知道View convertView只在第一頁顯示的那些item是被建立的,
當你滾動到下一頁的時候,就會重複使用,這時候就會出問題。
三、解決辦法
    HashMap<Integer,View> lmap = new HashMap<Integer,View>();
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        ViewHolder holder = null;
        
        if (lmap.get(position) == null) {            
            view = mInflater.inflate(R.layout.download_productdetail_item, null);
            holder = new ViewHolder();
            holder.txt_bookChapter = (TextView) view
                .findViewById(R.id.download_book_name);
            final int p = position;
            lmap.put(position, view);
            view.setTag(holder);
        }else{
            view = lmap.get(position);
            holder = (ViewHolder)view.getTag();
        }
   }
在這段代碼中,咱們能夠看到一開始定義了一個HashMap<Integer,View> lmap,在getView()方法中,
使用lmap.put(position, view)把每一個view和position一一對應起來,對於已經創建的view,
使用view = lmap.get(position)來取,這樣既能夠保存改變的狀態,又不會重複。

原文地址:http://www.eoeandroid.com/thread-208179-1-1.html?_dsign=98bbb545java

擴展:android

若是咱們用的是ExpandableListView呢?該怎麼解決呢?ide

import android.graphics.Point;
private Map<Point, View> checkedMap = new HashMap<>();
@override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
     if (checkedMap.get(new Point(groupPosition, childPosition)) == null) {
          .......
          checkedMap.put(new Point(groupPosition, childPosition), convertView);
          convertView.setTag(mViewHolder);
     }else{
          convertView = checkedMap.get(new Point(groupPosition, childPosition));
          mViewHolder = (ViewHolder) convertView.getTag();
      }
      .......
}
相關文章
相關標籤/搜索