Android Studio:如何从片段中托管的 recyclerview(adapter.java) 关闭对话框片段
Android Studio: How to close a dialog fragment from a recyclerview(adapter.java) hosted in a fragment
我在 recyclerview 中有一个对话片段,它工作正常。问题是在用户从对话框片段中选择了一个选项后我无法关闭它(对话框片段有另一个 recyclerview 填充它,点击它的项目我想做一些事情并关闭对话框片段)。有部分答案,但没有完整的答案。
谢谢
概览
片段>RecyclerView>对话框片段>带有菜单选项的 RecyclerView
单击菜单选项我想关闭对话框片段。
以下是我在视图上调用点击事件的适配器代码:
public class ContextMenuAdapter extends RecyclerView.Adapter<ContextMenuAdapter.contextMenuViewHolder> {
ArrayList<ContextMenuModel> contextMenuList;
Context contextMenuContext;
public ContextMenuAdapter(ArrayList<ContextMenuModel> contextMenuList, Context contextMenuContext) {
this.contextMenuList = contextMenuList;
this.contextMenuContext = contextMenuContext;
}
@NonNull
@Override
public contextMenuViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View contextMenuView = LayoutInflater.from(contextMenuContext).inflate(R.layout.sample_context_menu_rv, parent, false);
return new contextMenuViewHolder(contextMenuView);
}
@Override
public void onBindViewHolder(@NonNull final contextMenuViewHolder holder, int position) {
ContextMenuModel accountFeedModelPosition = contextMenuList.get(position);
holder.tvContextMenuOption.setText(accountFeedModelPosition.getMenuOption());
// On Click Listener for the recycler view items.
// 1. On Click menu option
holder.tvContextMenuOption.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(contextMenuContext, "Clicked"+ holder.tvContextMenuOption.getText(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return contextMenuList.size();
}
public class contextMenuViewHolder extends RecyclerView.ViewHolder{
TextView tvContextMenuOption;
public contextMenuViewHolder(@NonNull View itemView) {
super(itemView);
tvContextMenuOption = itemView.findViewById(R.id.tvContextMenuOption);
}
}
}
如果您有对对话框片段的引用,您可以通过直接在 DialogFragment 上使用 dismiss()
来实现。
来自 documentation :
public void dismiss ()
:
关闭片段及其对话框。如果片段被添加到返回堆栈,所有返回堆栈状态直到并包括这个条目将被弹出。否则,将提交一个新的事务来删除片段。
按照这个post终于实现了:
解法:
在 adapter.java 中向适配器添加一个接收 DialogFragment 的构造函数。
数组列表上下文菜单列表;
上下文上下文菜单上下文;
DialogFragment cmDialogFrag; //为了这个目的
public ContextMenuAdapter(ArrayList contextMenuList ,
上下文 contextMenuContext, DialogFragment cmDialogFrag) {
this.contextMenuList = 上下文菜单列表;
this.contextMenuContext = 上下文菜单上下文;
this.cmDialogFrag = cmDialogFrag; //以此目的
}
当您在activity.java或fragment.java中创建适配器时,为在步骤 1 中创建的构造函数传递值,如下所示:
ContextMenuAdapter myCMAdapter = new ContextMenuAdapter(contextMenuList ,
getActivity() , ContextMenuFragment.this);
这里最后一个 ContextMenuFragment.this 将传递给在步骤 1 中创建的构造函数。
在recyclerview视图调用的onClick里面:
cmDialogFrag.dismiss();
我在 recyclerview 中有一个对话片段,它工作正常。问题是在用户从对话框片段中选择了一个选项后我无法关闭它(对话框片段有另一个 recyclerview 填充它,点击它的项目我想做一些事情并关闭对话框片段)。有部分答案,但没有完整的答案。
谢谢 概览 片段>RecyclerView>对话框片段>带有菜单选项的 RecyclerView
单击菜单选项我想关闭对话框片段。
以下是我在视图上调用点击事件的适配器代码:
public class ContextMenuAdapter extends RecyclerView.Adapter<ContextMenuAdapter.contextMenuViewHolder> {
ArrayList<ContextMenuModel> contextMenuList;
Context contextMenuContext;
public ContextMenuAdapter(ArrayList<ContextMenuModel> contextMenuList, Context contextMenuContext) {
this.contextMenuList = contextMenuList;
this.contextMenuContext = contextMenuContext;
}
@NonNull
@Override
public contextMenuViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View contextMenuView = LayoutInflater.from(contextMenuContext).inflate(R.layout.sample_context_menu_rv, parent, false);
return new contextMenuViewHolder(contextMenuView);
}
@Override
public void onBindViewHolder(@NonNull final contextMenuViewHolder holder, int position) {
ContextMenuModel accountFeedModelPosition = contextMenuList.get(position);
holder.tvContextMenuOption.setText(accountFeedModelPosition.getMenuOption());
// On Click Listener for the recycler view items.
// 1. On Click menu option
holder.tvContextMenuOption.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(contextMenuContext, "Clicked"+ holder.tvContextMenuOption.getText(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return contextMenuList.size();
}
public class contextMenuViewHolder extends RecyclerView.ViewHolder{
TextView tvContextMenuOption;
public contextMenuViewHolder(@NonNull View itemView) {
super(itemView);
tvContextMenuOption = itemView.findViewById(R.id.tvContextMenuOption);
}
}
}
如果您有对对话框片段的引用,您可以通过直接在 DialogFragment 上使用 dismiss()
来实现。
来自 documentation :
public void dismiss ()
:
关闭片段及其对话框。如果片段被添加到返回堆栈,所有返回堆栈状态直到并包括这个条目将被弹出。否则,将提交一个新的事务来删除片段。
按照这个post终于实现了:
解法:
在 adapter.java 中向适配器添加一个接收 DialogFragment 的构造函数。
数组列表上下文菜单列表; 上下文上下文菜单上下文; DialogFragment cmDialogFrag; //为了这个目的
public ContextMenuAdapter(ArrayList contextMenuList , 上下文 contextMenuContext, DialogFragment cmDialogFrag) { this.contextMenuList = 上下文菜单列表; this.contextMenuContext = 上下文菜单上下文; this.cmDialogFrag = cmDialogFrag; //以此目的 }
当您在activity.java或fragment.java中创建适配器时,为在步骤 1 中创建的构造函数传递值,如下所示:
ContextMenuAdapter myCMAdapter = new ContextMenuAdapter(contextMenuList , getActivity() , ContextMenuFragment.this);
这里最后一个 ContextMenuFragment.this 将传递给在步骤 1 中创建的构造函数。
在recyclerview视图调用的onClick里面:
cmDialogFrag.dismiss();