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终于实现了:

解法:

  1. 在 adapter.java 中向适配器添加一个接收 DialogFragment 的构造函数。

    数组列表上下文菜单列表; 上下文上下文菜单上下文; DialogFragment cmDialogFrag; //为了这个目的

    public ContextMenuAdapter(ArrayList contextMenuList , 上下文 contextMenuContext, DialogFragment cmDialogFrag) { this.contextMenuList = 上下文菜单列表; this.contextMenuContext = 上下文菜单上下文; this.cmDialogFrag = cmDialogFrag; //以此目的 }

  2. 当您在activity.java或fragment.java中创建适配器时,为在步骤 1 中创建的构造函数传递值,如下所示:

    ContextMenuAdapter myCMAdapter = new ContextMenuAdapter(contextMenuList , getActivity() , ContextMenuFragment.this);

这里最后一个 ContextMenuFragment.this 将传递给在步骤 1 中创建的构造函数。

  1. 在recyclerview视图调用的onClick里面:

    cmDialogFrag.dismiss();