У меня есть фрагмент, в котором хранится представление переработчика, в котором имеется диспетчер с разнесенной сеткой, для которого у держателя просмотра просто есть изображение. Я пытаюсь сделать так, чтобы после выбора пункта меню (значок удаления) 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? Или кто-нибудь знает, что здесь происходит?