문제

I have set a ListView with a custom CursorAdapter in MainActivity, and when "EDIT" menu is clicked, the CursorAdapter changes its View to set visibility of CheckBoxes.

At this, I found that the onClickListener is aware of changes of the CheckBox not in the MainAcitivity but in the CursorAdapter class. So I coded that the id values are restored in a ArrayList whenever the CheckBoxes are clicked, and returned when a method is called in MainActivity.

The problem is, I want for option menus to be changed if the CheckBox is checked (for example, "DELETE" and "MOVE" menu is unable when no CheckBox is checked, and enabled once CheckBoxes are clicked), but don't know how.

Some parts of my MainActivity and CursorAdapter

MainActivity.java:

public class MainActivity extends Activity {

private MenuItem itEdit, itSort, itView, itSelectAll, itDeselectAll, itDelete, itMove;
private boolean isEditChecked;

private ListView lvWords;
private WordAdapter wordadapter;
private ArrayList<Integer> checkedWords;
private Cursor wordCursor;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lvWords = (ListView) findViewById(R.id.lv_words);

    dbhandler = DBHandler.open(this);
    wordCursor = dbhandler.selectWords(activeNoteId);

    wordadapter = new WordAdapter(this, wordCursor, isEditChecked);
    lvWords.setAdapter(wordadapter);

    ....
    ...
    ..
}

protected void onResume() {
    super.onResume();
    refreshListViews();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);

    itEdit = menu.findItem(R.id.it_edit);
    itSort = menu.findItem(R.id.it_sort);
    itView = menu.findItem(R.id.it_view);
    itSelectAll = menu.findItem(R.id.it_select_all);
    itDeselectAll = menu.findItem(R.id.it_deselect_all);
    itDelete = menu.findItem(R.id.it_delete);
    itMove = menu.findItem(R.id.it_move);

    itEdit.setVisible(true);
    itSort.setVisible(true);
    itView.setVisible(true);
    itSelectAll.setVisible(false);
    itDeselectAll.setVisible(false);
    itDelete.setVisible(false);
    itMove.setVisible(false);

    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    ....
    ...
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.it_edit:
        onEditMenuClicked();
        break;
    case R.id.it_delete:
        checkedWords = wordadapter.getCheckedArrayList();
        final int checkedDeleteSize = checkedWords.size();
        ....
        ...     
        break;
    }
    return super.onOptionsItemSelected(item);
}

// when edit menu clicked
private void onEditMenuClicked() {
    isEditChecked = !isEditChecked;
    itSort.setVisible(!isEditChecked);
    itView.setVisible(!isEditChecked);
    itSelectAll.setVisible(isEditChecked);
    itDeselectAll.setVisible(isEditChecked);
    itDelete.setVisible(isEditChecked);
    itMove.setVisible(isEditChecked);

    wordadapter.setVisibility(isEditChecked);

    refreshListViews();
}

private void refreshListViews() {
    wordCursor.close();
    wordCursor = dbhandler.selectWords(activeNoteId);
    wordadapter.changeCursor(wordCursor);
    setVisibilityViews();
}
}

WordAdapter.java:

public class WordAdapter extends CursorAdapter {

private boolean isCheckBoxVisable;
private ArrayList<Integer> checkedArray;
private boolean setCheck;

public WordAdapter(Context context, Cursor c, boolean check) {
    super(context, c);
    isCheckBoxVisable = check;
    checkedArray = new ArrayList<Integer>();
    setCheck = false;
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    CheckBox check = (CheckBox) view.findViewById(R.id.cb_list_word_check);

    final int id = cursor.getInt(cursor.getColumnIndex("_id"));

    if(isCheckBoxVisable)
        check.setVisibility(View.VISIBLE);
    else check.setVisibility(View.GONE);

    check.setOnCheckedChangeListener(new OnCheckedChangeListener() {    
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            /////// I think something is added here /////

            if(isChecked){
                checkedArray.add(id);
            }
            else{
                checkedArray.remove(new Integer(id));
            }
        }
    });
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    Log.d("newView()","start of newView");
    LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(R.layout.word_list_row, parent, false);
    Log.d("newView()","end of newView");
    return v;
}

// set visibility of checkbox
public void setVisibility(boolean check){
    isCheckBoxVisable = check;
}

public ArrayList<Integer> getCheckedArrayList(){
    return checkedArray;
}
}
도움이 되었습니까?

해결책

If you want to perform a menu update, you must call invalidateOptionsMenu(). It will call onCreateOptionsMenu(Menu menu) back, were you can update (re-create) a menu depending on the state your activity is in.

Runtime changes in menu are explained here in more details.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top