私のバグを説明する簡単な方法は、ビデオで見せることだと思います。しかし、一般的な考え方は、データベースを使用して、チェックボックスのリスト内のどの項目がチェックされているかを追跡することです。項目をクリックしてそのリストのアクション モードを有効にすると、変更がデータベースに既に反映されているにもかかわらず、変更がすぐに忘れられます。これをさらに悪化させるのは、複数のアイテムがこのバグに悩まされると、データベース内の 1 つのアイテムがチェックされ、もう 1 つのアイテムがチェックされなくなり、2 つのアイテムがこれを循環し続ける、奇妙な循環ロジックを形成することになります。チェックボックスがチェックされた状態とチェックされていない状態の間で絶えず循環し、チェックボックスのonCheckedChangedListener
. コードは入っていませんonListItemClick()
これらの変更をリスト レベルまたはデータベース レベルで発生させる必要があり、CursorLoader をリロードしたり、選択した項目を操作したりするonPrepareActionMode
コードはありません。onCreateActionMode
何が原因でこれが起こっているのかを理解するのを手伝ってくれる人はいますか? (私の実装はビデオで見つけることができますが、以下にも含めました。)
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());
}
}