在RecyclerView.Adapter中单击传递数据
我的片段上有一个RecyclerView
,显示我从FTP服务器加载的某些文件。 我正在尝试为每个项目设置DialogFragment
,因此当单击它时,将显示DialogFragment
,用户可以在其中选择是下载还是打开文件。
我的问题是:
我需要向我的对话框发送2件事:
- 目标片段,在用户选择要执行的操作后下载/打开文件。 这很容易用
setTargetFragment()
,唯一的问题是我无法访问我的RecyclerView.ViewHolder
的片段。 - 要下载/打开的文件的名称。 这样对话框就会将其发送到目标片段。 这里的问题是我无法访问
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()));
- 解析器m3u文件在android studio中使用java
- 将Cookie传递给GET请求的问题(POST后)
- oauth2 android中的jsonresponse中的invalid_client
- TLS v1.2上的Android客户端/服务器
- Android viewpager:添加/删除页面时的奇怪错误
- 无法将AsyncTask的响应发布到MainActivity
- 使用自定义android.bluetooth。 而不是在android studio中默认的sdk android.jar中存在一个
- Android TestCase中的Dagger 2dependency injection
- 无法从资产中复制SQLite数据库