0

これは、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()MainActivityposition

メソッド内で更新できるようにListViewしたいだけです。MainListFragmentActionMode.Callback.onDestroyActionMode()

誰かが以前にこれを機能させたことがありますか?もしそうなら、彼/彼女は何か提案がありますか?

4

1 に答える 1

1

あなたの実装に従ってこの回答を提案しています。より良い方法があるかもしれません。最初に、あなたが使用しているあなたをgetAdapter() 返すメソッドを作成しますadapterlistview

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;

それが役立つことを願っています。

于 2014-02-10T07:39:17.153 に答える