在RecyclerView.Adapter中单击传递数据

我的片段上有一个RecyclerView ,显示我从FTP服务器加载的某些文件。 我正在尝试为每个项目设置DialogFragment ,因此当单击它时,将显示DialogFragment ,用户可以在其中选择是下载还是打开文件。
我的问题是:
我需要向我的对话框发送2件事:

  1. 目标片段,在用户选择要执行的操作后下载/打开文件。 这很容易用setTargetFragment() ,唯一的问题是我无法访问我的RecyclerView.ViewHolder的片段。
  2. 要下载/打开的文件的名称。 这样对话框就会将其发送到目标片段。 这里的问题是我无法访问RecyclerView.ViewHolder的数据集,因为它的静态和我的数据集不是。

为什么在ViewHolder上
如果有更好的地方,我会很高兴听到。 我在RecyclerView.ViewHolder尝试的原因是它可以访问该位置(被点击的项目)。 我想过在onBindViewHolder()上做这个,但是我可以访问数据集而不是位置。

我的适配器代码:

 public class FilesAdapter extends RecyclerView.Adapter { public final String TAG = "FILES_ADAPTER"; private FTPFile[] dataset; //some methods and stuff... public static class ViewHolder extends RecyclerView.ViewHolder { public final String TAG = "FILES_VH"; private final TextView nameTextView; private final TextView infoTextView; private final ImageView imageView; public ViewHolder(View v) { super(v); // Define click listener for the ViewHolder's View. v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "Element " + getPosition() + " clicked."); //here i want to open the dialog fragment and start downloading/openning } }); nameTextView = (TextView) v.findViewById(R.id.fileNameTextView); infoTextView = (TextView) v.findViewById(R.id.fileInfoTextView); imageView = (ImageView) v.findViewById(R.id.fileImageView); } public TextView getNameTextView() { return nameTextView; } public ImageView getImageView() { return imageView; } public TextView getInfoTextView() { return infoTextView; } } } 

非常感谢帮助,谢谢。

所以我找到了一个解决方案,我在onBindViewHolder()上创建了一个带有匹配参数的自定义OnClickListener ,并将其设置为ViewHolder
ViewHolder:

  public static class ViewHolder extends RecyclerView.ViewHolder { private final TextView nameTextView; private final TextView infoTextView; private final ImageView imageView; public final String TAG = "FILES_VH"; private View v; public ViewHolder(View v) { super(v); this.v = v; nameTextView = (TextView)v.findViewById(R.id.fileNameTextView); infoTextView = (TextView)v.findViewById(R.id.fileInfoTextView); imageView = (ImageView)v.findViewById(R.id.fileImageView); } public void setOnClickListener(View.OnClickListener listener){ v.setOnClickListener(listener); } } 

我的自定义监听器:

 private class downloadOnClickListener implements View.OnClickListener{ RemoteFilesFragment fragment; String file; public downloadOnClickListener(RemoteFilesFragment fragment, String file){ this.file = file; this.fragment = fragment; } @Override public void onClick(View v) { Log.d(TAG, "File " + file + " clicked."); DownloadDialog dialog = DownloadDialog.newInstance(file); dialog.setTargetFragment(fragment, 1); Log.e(TAG, fragment == null ? "fragment null" : "fragment not null"); FragmentManager fm = fragment.getActivity().getSupportFragmentManager(); dialog.show(fm, "Download"); } } 

并在onBindViewHolder()上添加以下代码:

 holder.setOnClickListener(new downloadOnClickListener(fragment, dataset[position].getName()));