これは、StackOverflow でしばらくの間浮かんできた質問です。この質問を重複としてマークする前に、私はこのリンクを認識しています。ただし、この質問はあいまいで、コードがなく、完全には回答されていないようです。
それでは私の質問に進みます:
私はListFragment
(MainListFragment)を持ってonLongItemClick
いますContextual Action Bar
。この Contextual Action Bar 内のメニュー項目の 1 つを使用すると、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-implementing クラスがあります:
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 内でこれらのソリューションを使用する方法がわかりません。私のメソッドを見ると、クリックされた ListView 項目のと の両方を渡すonLongClick()
ために使用しています。これは良いフォームですか?mode.setTag()
MainActivity
position
メソッド内で更新できるようにListView
したいだけです。MainListFragment
ActionMode.Callback.onDestroyActionMode()
誰かが以前にこれを機能させたことがありますか?もしそうなら、彼/彼女は何か提案がありますか?