gpt4 book ai didi

java - 从 ActionMode.Callback.onDestroyActionMode() 刷新 ListView

转载 作者:行者123 更新时间:2023-12-01 13:29:52 24 4
gpt4 key购买 nike

这个问题已经在 StackOverflow 上流传了一段时间,在您将此问题标记为重复之前,我知道 this link 。然而,这个问题很模糊,没有代码,而且似乎没有得到完全解答。

接下来我的问题:

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

在实现 ActionMode.Callback 的类中,我可以删除长按的项目,但我需要 ListView删除后会自行刷新,这样用户就不必切换 Fragments 来查看删除的效果。

在这里你可以看到我的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()通过MainActivityposition被单击的 ListView 项目的名称。这是好的形式吗?

我只是希望能够刷新 ListView来自MainListFragment ActionMode.Callback.onDestroyActionMode()内方法。

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

最佳答案

我根据您的实现建议这个答案,可能有更好的方法,首先创建一个方法 getAdapter() ,它将返回您正在使用的 adapter对于您的listview

ArrayAdapter adapter;

public ArrayAdapter getAdapter()
{
// TODO Auto-generated method stub
return adapter;
}

现在像这样更改您的代码,添加此 activity.getAdapter().notifyDataSetChanged();

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);
activity.getAdapter().notifyDataSetChanged();
//Log.d("My Debug Bitches", "size after " + activity.getLists().size());
break;

希望能有所帮助。

关于java - 从 ActionMode.Callback.onDestroyActionMode() 刷新 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21636017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com