这是一个在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项的MainActivity
和position
。这是好形式吗?
我只想在ListView
方法中从MainListFragment
刷新ActionMode.Callback.onDestroyActionMode()
。
之前有没有人让这个工作过,如果是的话,他/她有什么建议吗?
答案 0 :(得分:1)
我建议根据您的实施提供此答案,可能有更好的方法,首先创建一个方法getAdapter()
,该方法将返回您用于adapter
的{{1}}。
listview
现在更改您的代码,添加此ArrayAdapter adapter;
public ArrayAdapter getAdapter()
{
// TODO Auto-generated method stub
return adapter;
}
activity.getAdapter().notifyDataSetChanged();
希望它会有所帮助。