Android列表含有複選框滾動時狀態錯亂的問題

問題描述與分析

當列表中含有checkBox或switch,而且條目數量超過一頁,發生滾動的時候往往會出現複選框的選中狀態發生錯亂的現象,而造成這種現象的原因主要是當listView中的數據項較多於當前屏幕所能包含的項時,下一頁的數據項將會重用滾出屏幕的視圖

解決方法

創建一個數組用來保存處於選中狀態的按鈕的位置

  • 代碼示例:
public class AddMonitorAdapter extends SimpleCursorAdapter {
  ......
   List< Integer>  mSelectedItemsPositions = new ArrayList<>();//用來保存處於選中狀態的按鈕的位置

    public AllsitesListAdapter(Context context, int layout, Cursor c,
                               String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
        // TODO Auto-generated constructor stub
        mServerMonitor = (ServerMonitorPlus) context.getApplicationContext();
        //用數據庫中的數據初始化數組
        setCheckedPosition(c);
    }

    /*
   根據數據庫中的站點是否監控的狀態將處於監控狀態的站點的位置添加到數組中
    */
    public void setCheckedPosition(Cursor c) {
        boolean isMonitoring;
        for (int i = 0; i < c.getCount(); i++) {
            c.moveToPosition(i);
            //獲取對應位置上的站點的狀態
            isMonitoring = c.getInt(DataBaseAdapter.SiteColumns.IS_MONITORING_INDEX) > 0;
            if (isMonitoring)//如果站點處於監控中
            {
                mSelectedItemsPositions.add(i);//添加到數組中
                //Log.e("AddMonitorAdapter", "setCheckedPosition: add "+ i +" "+c.getPosition());
            }
        }
     }
     @Override
    public void bindView(final View view, Context context, final Cursor cursor) {
        super.bindView(view, context, cursor);
        final CheckBox checkBox = (CheckBox) view.findViewById(R.id.add_site_checkbox);

        //當listView中的數據項較多於當前屏幕所能包含的項時,下一頁的數據項將會重用滾出屏幕的視圖
        //將cursor的位置作爲對應位置上checkBox的標記
        checkBox.setTag(cursor.getPosition());
        //如果數組中含有此位置,說明checkBox處於選中狀態,否則,未選中
        if (mSelectedItemsPositions.contains(cursor.getPosition())) {
            checkBox.setChecked(true);
        } else {
            checkBox.setChecked(false);
        }

        checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = (int) v.getTag();//獲此按鈕的附加位置
                int isOpen = 0;//表示按鈕的選中狀態
                if (checkBox.isChecked())//如果被選中
                {
                    //檢查數組中是否含有此位置,如果不含有則將位置添加進去
                    if (!mSelectedItemsPositions.contains(position)) {
                        mSelectedItemsPositions.add(position);
                        isOpen = 1;
                    }
                } else//否則,從數組中移除此位置元素
                {
                    mSelectedItemsPositions.remove((Object) position);
                    isOpen = 0;
                }
              //更新數據庫 do something
            }
        });

    }

如果有不正確的地方,歡迎大家指出,一起解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章