gpt4 book ai didi

java - 如何在选择菜单项后启用recyclerview OnItemClickListener?

转载 作者:行者123 更新时间:2023-12-01 16:58:37 26 4
gpt4 key购买 nike

我有一个 fragment ,其中包含一个 recyclerview,它有一个交错的网格布局管理器,其中 View 持有者只有一个图像。我试图在选择菜单选项(删除图标)后为 recyclerView 启用 onItemClickListener,以便只需点击图像即可删除图像。此外,我将删除图标替换为停止图标,然后禁用 onItemClickListener。在选择菜单项后,我无法让 onItemClickListener 执行与删除相关的代码,但是当此代码仅位于 Fragment 的 onCreateView 方法中时,onItemClickListener 工作得很好。

这是我的适配器类中 ViewHolder 和 onClick 接口(interface)的代码:

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;
}

这是处理菜单项以及如何在 fragment 中删除内容的代码

@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);
}

删除逻辑:

 private void delete(int position) {

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

正如我所说,当刚刚在 fragment 的 onCreateView 方法中启动 onItemClickListener 时,图像删除得很好,但是当“动态”执行此操作时,即使 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

我还尝试通过 View 中的常规按钮以及异步执行来启用和禁用监听器,但是这些都不起作用。

这是异步尝试的代码:

 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?或者有人知道这里发生了什么吗?

最佳答案

在 fragment 的 onCreate() 下调用 setHasOptionsMenu(true) 来通知框架该 fragment 想要处理选项菜单。

关于java - 如何在选择菜单项后启用recyclerview OnItemClickListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61549165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com