Как включить утилиту просмотра OnItemClickListener после выбора пункта меню? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть фрагмент, в котором хранится представление переработчика, в котором имеется диспетчер с разнесенной сеткой, для которого у держателя просмотра просто есть изображение. Я пытаюсь сделать так, чтобы после выбора пункта меню (значок удаления) onItemClickListener был включен для recyclerView, чтобы можно было удалять изображения, просто нажав на них. Кроме того, у меня так, что значок удаления заменяется на значок остановки, чтобы затем отключить onItemClickListener. У меня возникли проблемы при получении onItemClickListener для выполнения кода, относящегося к удалению, после того, как после выбора пункта меню, однако, когда этот код находится только в методе onCreateView фрагмента, onItemClickListener работает просто отлично.

Вот код для интерфейса ViewHolder и onClick в моем классе адаптера:

public class PhotoListViewHolder extends RecyclerView.ViewHolder {

        SquareImageView imageView;

        public PhotoListViewHolder (@NonNull View itemView, OnItemClickListener listener) {
            super(itemView);

            imageView = itemView.findViewById(R.id.image);

            itemView.setOnClickListener(v -> {
                if (listener != null) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {

                        listener.onItemClick(position);
                    }
                }
            });
        }

    }
public interface OnItemClickListener {
        void onItemClick(int position);

    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    public OnItemClickListener getListener() {
        return listener;
    }

, а вот код для обработки пунктов меню и того, как вещи удаляются во фрагменте

@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        switch(item.getItemId()) {

            case R.id.delete_items:
                Toast.makeText(getContext(), "Tap an image to delete it", Toast.LENGTH_SHORT).show();
                adapter.setOnItemClickListener(this);
                Log.d(TAG, "start-" + adapter.getListener());
                deleteItem.setVisible(false);
                stopDelete.setVisible(true);
                return true;

            case R.id.stop_selection:

                adapter.setOnItemClickListener(null);
                Log.d(TAG, "stop-" + adapter.getListener());
                currDelete = END_DELETE;
                stopDelete.setVisible(false);
                deleteItem.setVisible(true);

                return true;
            default:
                return super.onOptionsItemSelected(item);
        }

    }
@Override
    public void onItemClick(int position) {
        delete(position);
    }

Logi c для удаления:

 private void delete(int position) {

        Log.d(TAG, "delete: " + position);
        photoList.removePhoto(position);
        adapter.notifyDataSetChanged();
        savePhotos();
    }

, как я уже сказал, при простом запуске onItemClickListener в методе фрагмента onCreateView изображение удаляется нормально, однако при «динамическом» делая это, он не работает, даже если onItemClickListener создается и уничтожается, как видно из этого журнала:

2020-05-01 12:51:32.518 8719-8777/com.streetxportrait.android.planrr D/EGL_emulation: eglMakeCurrent: 0xd8e1a240: ver 3 0 (tinfo 0xd8e0f1c0)
2020-05-01 12:51:32.531 8719-8777/com.streetxportrait.android.planrr D/EGL_emulation: eglMakeCurrent: 0xd8e1a240: ver 3 0 (tinfo 0xd8e0f1c0)
2020-05-01 12:51:52.869 8719-8719/com.streetxportrait.android.planrr D/Grid-fragments: stop-null
2020-05-01 12:58:41.889 8719-8719/com.streetxportrait.android.planrr D/Grid-fragments: start-GridFragment{5a15f1} (3a58a131-1b5e-4fd5-8369-754fb2750bf8) id=0x7f080141 android:switcher:2131231041:0}
2020-05-01 12:58:41.929 8719-8777/com.streetxportrait.android.planrr D/EGL_emulation: eglMakeCurrent: 0xd8e1a240: ver 3 0 (tinfo 0xd8e0f1c0)
2020-05-01 12:58:41.936 8719-8777/com.streetxportrait.android.planrr D/EGL_emulation: eglMakeCurrent: 0xd8e1a240: ver 3 0 (tinfo 0xd8e0f1c0)
2020-05-01 12:58:52.868 8719-8719/com.streetxportrait.android.planrr D/Grid-fragments: stop-null

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

вот код для попытки асин c:

 private void testWhatever() {


        AsyncTask.execute(() -> {
            while (true) {
                Log.d(TAG, "testWhatever: Current: " + currDelete);

                if (currDelete == START_DELETE) {
                    adapter.setOnItemClickListener(this);
                    Log.d(TAG, "testWhatever: start-" + adapter.getListener());
                }
                else if (currDelete == END_DELETE) {
                    adapter.setOnItemClickListener(null);
                    Log.d(TAG, "testWhatever: stop-" + adapter.getListener());
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }

Разве нельзя динамически включать и отключать onClickListeners? Или кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 01 мая 2020

В вызове фрагмента onCreate () setHasOptionsMenu (true) , чтобы уведомить платформу о том, что фрагмент хотел бы обработать меню параметров.

...