从ActionMode.Callback.onDestroyActionMode()刷新ListView

时间:2014-02-07 19:17:21

标签: java android android-listview android-fragments android-actionmode

这是一个在StackOverflow上流传一段时间的问题,在您将此问题标记为重复之前,我知道this link。但是,这个问题含糊不清,没有代码,似乎没有得到完全回答。

关于我的问题:

我有ListFragment(MainListFragment),onLongItemClick,打开Contextual Action Bar。此上下文操作栏中的一个菜单项允许删除长按的ListView项。

在实现ActionMode.Callback的类中,我能够删除长按项,但是我需要ListView在删除后自行刷新,这样用户就不必将片段切换为看到删除的影响。

在这里,您可以在onLongItemClickListener中看到我的MainListFragment

this.getListView().setOnItemLongClickListener(new OnItemLongClickListener(){

        @Override
        public boolean onItemLongClick(AdapterView<?> adapter, View view,
                int pos, long id) {
            // TODO Auto-generated method stub
            Log.d("My Debug Bitches", "made it to the listener");
            MainListContextualMenu menu = new MainListContextualMenu();
            //view.startActionMode(menu);
            ActionMode mode = getActivity().startActionMode(menu);
            Object[] tags = new Object[2];
            tags[0] = view.getRootView().getContext();
            tags[1] = pos;
            mode.setTag(tags);
            //view.setSelected(true);
            return true;
        }

    });

这是我的ActionMode.Callback实现类:

public class MainListContextualMenu implements ActionMode.Callback{

@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    // TODO Auto-generated method stub

    switch(item.getItemId()){
    case R.id.main_list_contextual_menu_delete:

        //MainActivity activity = (MainActivity) mode.getCustomView().getContext();
        //activity.getLists().remove(mode.getTag());

        Object[] tags = (Object[]) mode.getTag();
        MainActivity activity = (MainActivity) tags[0];
        int index = (Integer) tags[1];
        //Log.d("My Debug Bitches","" +index);
        //Log.d("My Debug Bitches", "size before " + activity.getLists().size());
        activity.getLists().remove(index);
        //Log.d("My Debug Bitches", "size after " + activity.getLists().size());
        break;
    case R.id.main_list_contextual_menu_edit:
        break;
    }


    return false;
}

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    // TODO Auto-generated method stub
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(R.menu.main_list_contextual_menu, menu);
    Log.d("My Debug Bitches", "menu inflated");
    return true;
}

@Override
public void onDestroyActionMode(ActionMode mode) {
    // TODO Auto-generated method stub
    Object[] tags = (Object[]) mode.getTag();
    MainActivity activity = (MainActivity) tags[0];
    ListView view = (ListView) activity.getCurrentFocus();
}

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    // TODO Auto-generated method stub
    return false;
}

}

我尝试在invalidateViews()方法中使用onDestroyActionMode()无效,我看到其他人推荐notifyDataSetChange()

但是,我不确定如何在ActionMode.Callback中使用这些解决方案。如果您查看我的onLongClick()方法,我会使用mode.setTag()传递已单击的ListView项的MainActivityposition。这是好形式吗?

我只想在ListView方法中从MainListFragment刷新ActionMode.Callback.onDestroyActionMode()

之前有没有人让这个工作过,如果是的话,他/她有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我建议根据您的实施提供此答案,可能有更好的方法,首先创建一个方法getAdapter(),该方法将返回您用于adapter的{​​{1}}。

listview

现在更改您的代码,添加此ArrayAdapter adapter; public ArrayAdapter getAdapter() { // TODO Auto-generated method stub return adapter; }

activity.getAdapter().notifyDataSetChanged();

希望它会有所帮助。