У меня следующая проблема. Я использую для своего приложения только ListView в MainActivity. Чтобы иметь возможность выполнять выбор нескольких элементов, я реализовал следующую логику для ListView:

listview.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode actionMode, int i, long l, boolean b) {
                Cursor cursor = item_repository.getItemList();
                if (listview.getCheckedItemCount() > 0)
                    actionMode.setSubtitle(listview.getCheckedItemCount() + " item(s) selected");
                cursor.moveToPosition(i);
                if (b) {
                    item_ids.add(cursor.getString(0));
                    listview.getChildAt(i).setBackgroundColor(getResources().getColor(R.color.selected_item_color));
                } else {
                    item_ids.remove(cursor.getString(0));
                    listview.getChildAt(i).setBackgroundColor(Color.WHITE);
                }
            }

            public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
                MenuInflater inflater = actionMode.getMenuInflater();
                inflater.inflate(R.menu.sel_del_btn, menu);
                actionMode.setTitle("Select Item(s)");
                return true;
            }

            public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
                return false;
            }

            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                if (menuItem.getItemId() == R.id.delete_ab_btn) {
                    AlertDialog.Builder del_builder = new AlertDialog.Builder(MainActivity.this);
                    View del_view = getLayoutInflater().inflate(R.layout.del_layout, null);
                    del_builder.setView(del_view);
                    AlertDialog del_dialog = del_builder.create();
                    del_dialog.show();

                    Button yes_btn = del_view.findViewById(R.id.yes_btn);
                    yes_btn.setOnClickListener((View v) -> {
                        for (String id : item_ids)
                            list_repository.deleteData(id);

                        Toast.makeText(MainActivity.this, "Selected item(s) successfully deleted", Toast.LENGTH_LONG).show();
                        del_dialog.dismiss();
                        update();
                    });

                    Button no_btn = del_view.findViewById(R.id.no_btn);
                    no_btn.setOnClickListener((View v) -> {
                        del_dialog.dismiss();
                    });
                }

                if(menuItem.getItemId() == android.R.id.home) {
                    // How to catch
                }
                update();
                actionMode.finish();
                return true;
            }

            public void onDestroyActionMode(ActionMode actionMode) {
            }
        });

Логика работает. Однако, когда я выбираю элементы и просто отменяю выбор, нажимая на стрелку назад или в любом месте экрана, элементы остаются выделенными, а не отменяются.

При выборе элемента

пока не выбран

Как вы можете видеть в коде, я вручную установил другой цвет для выбранных элементов. Потому что это была самая подходящая логика для моей известной мне реализации.

Я попытался поймать событие после того, как была нажата стрелка назад, чтобы снова сбросить цвет вручную, но это не работает, особенно я не могу поймать его событие при отмене выбора.

Как я могу это решить? Заранее большое спасибо, и если мне было недостаточно ясно, дайте мне знать, я попробую еще раз.

1
Mark Delphi 29 Май 2018 в 22:29

1 ответ

Лучший ответ

Стрелка назад К событию можно получить доступ, используя onDestroyActionMode(ActionMode actionMode),

Т.е.

 public void onDestroyActionMode(ActionMode actionMode) {
            Toast.makeText(MainActivity.this, "Clicked Back Button", Toast.LENGTH_SHORT).show();
        }

Надеюсь, это поможет вам.

0
Sachin Varma 3 Июн 2018 в 10:58