2012-07-25 66 views
0

我認爲更容易的方式來描述我的錯誤是showing it in a video。但總體思路是,我使用數據庫來跟蹤複選框列表中的哪些項目被選中。每當我點擊某個項目並激活該列表的操作模式時,儘管它們已經進入數據庫,但它會立即忘記這些更改。更糟糕的是,當多個項目受到這個bug的影響時,它們最終形成了一個奇怪的循環邏輯,其中數據庫中的一個項目將被檢查,另一個項目將被取消選中,並且這兩個項目將在一個循環中繼續執行因爲複選框在檢查狀態和未檢查狀態之間不停地循環,因此觸發複選框的onCheckedChangedListener,因此列表上的操作已完成。 onListItemClick()中沒有任何代碼會導致這些更改在列表級別或數據庫級別發生,並且onPrepareActionModeonCreateActionMode中沒有代碼會重新加載CursorLoader或操作選定的項目。任何人都可以幫我弄清楚會發生什麼事情嗎? (我的實現可以在視頻中找到,但我也包括它的下面。)奇怪的錯誤在我的數據庫造成的變化,當沒有人應該發生

public class TaskCursorAdapter extends ResourceCursorAdapter{ 

public View newView(Context context, Cursor cursor, ViewGroup parent){ 
     final LayoutInflater inflater = LayoutInflater.from(context); 
     final long assignedID = cursor.getInt(cursor.getColumnIndex(NagTasksDatabaseHelper.ID)); 
     View v = inflater.inflate(layout, parent, false); 
     CheckBox taskCheckBox = (CheckBox)v.findViewById(R.id.taskCheckBox); 
     TextView taskText = (TextView)v.findViewById(R.id.taskTitle); 
     TextView taskNote = (TextView)v.findViewById(R.id.taskNote); 
     if (cursor.getInt(cursor.getColumnIndex(NagTasksDatabaseHelper.CHECKED))==1){ 
      taskText.setPaintFlags(taskText.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
      taskNote.setPaintFlags(taskNote.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
     } 
     taskCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       //Current method: 

       AlertDialog.Builder builder = new AlertDialog.Builder(buttonView.getContext()); 
       builder.setCancelable(true); 
       Log.i("TaskCursorAdapter", "CheckBox assignedID="+assignedID); 
       if (assignedID!=-1) { 
        NagTasksDatabaseHelper helper = new NagTasksDatabaseHelper(buttonView.getContext()); 
        if (isChecked) { 
         helper.checkOffTask(assignedID); 
         //builder.setMessage("Item "+assignedID+" checked"); 
        } else { 
         helper.uncheckTask(assignedID); 
         //builder.setMessage("Item "+assignedID+" unchecked"); 
        } 
        helper.close(); 
       } else { 
        builder.setMessage("No ID found. Try something else."); 
        builder.create().show(); 
       } 
      } 
     }); 
     return v; 
    } 
    public void bindView(View v, Context context, Cursor cursor){ 
     CheckBox taskCheckBox = (CheckBox)v.findViewById(R.id.taskCheckBox); 
     TextView taskText = (TextView)v.findViewById(R.id.taskTitle); 
     TextView taskNote = (TextView)v.findViewById(R.id.taskNote); 
     taskCheckBox.setChecked(cursor.getInt(cursor.getColumnIndex(NagTasksDatabaseHelper.CHECKED))==1); 
     //final long assignedID = v.getId(); 
     //v.setClickable(true);  
     //LinearLayout holder = (LinearLayout)v.findViewById(R.id.container); 
     //holder.setClickable(true); 
     //IdFromDb = c.getInt(c.getColumnIndex(NagTasksDatabaseHelper.ID)); 
     taskText.setText(cursor.getString(cursor.getColumnIndex(NagTasksDatabaseHelper.TASK))); 
     taskNote.setText(cursor.getString(cursor.getColumnIndex(NagTasksDatabaseHelper.NOTE))); 
     //isCheckedFromDb = c.getInt(c.getColumnIndex(NagTasksDatabaseHelper.CHECKED)); 
     //cursor = c; 
    } 

public class TaskListFragment extends SherlockListFragment implements ActionMode.Callback { 
public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    MenuInflater inflater = mode.getMenuInflater(); 
    inflater.inflate(R.menu.context_menu_single_choice, menu); 
    mode.setTitle(R.string.activeActionMode); 
    return true; 
} 
@Override 
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 

    return false; 
} 
public void onListItemClick(ListView l, View v, int position, long id){ 
    //super.onListItemClick(l, v, position, id); 
    Log.i("NagTaskListFragment", "User clicked on "+id); 
    if (mActionMode == null) { 
     idForActionMode=id; 
     mActionMode = getSherlockActivity().startActionMode(this); 
    } 
    if (l.getSelectedView() == v) { 
     v.setSelected(false); 
     mActionMode.finish(); 
     mActionMode = null; 
     idForActionMode = -1; 
    } else if (l.getSelectedView() != null) { 
     l.getSelectedView().setSelected(false); 
     v.setSelected(true); 
     idForActionMode = id; 
     //onPrepareActionMode(mActionMode, mActionMode.getMenu()); 
     //Log.i("NagTaskListFragment", "selectedItemID = "+l.getSelectedItemId()); 
    } else { 
     v.setSelected(true); 
     idForActionMode = id; 
     //Log.i("NagTaskListFragment", "selectedItemID = "+l.getSelectedItemId()); 
    } 
} 
+0

請在這裏發佈有效的代碼,它更容易閱讀,很高興在一個地方。 – Sam 2012-07-26 00:02:29

+0

@Sam:用代碼編輯。 – MowDownJoe 2012-07-26 02:15:13

回答

0

所以,我感動setChecked()方法newView而且似乎已經解決了這一問題。我不確定這是否是正確的修復方法,但現在可行。