java - 在 RecyclerView.Adapter 中单击时传递数据

标签 java android android-fragments android-adapter android-recyclerview

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

  1. 目标 fragment ,将在用户选择要执行的操作后下载/打开文件。使用 setTargetFragment() 可以轻松实现这一点,唯一的问题是我无权访问 RecyclerView.ViewHolder 中的 fragment 。
  2. 要下载/打开的文件的名称。这样对话框就会将其发送到目标 fragment 。这里的问题是我无权访问 RecyclerView.ViewHolder 中的数据集,因为它是静态的,而我的数据集不是。

为什么选择 ViewHolder
如果有更好的地方可以做到这一点,我会很高兴听到。我在 RecyclerView.ViewHolder 中尝试这样做的原因是它可以访问该位置(被单击的项目)。我曾考虑过在 onBindViewHolder() 上执行此操作,但在那里我可以访问数据集,但不能访问该位置。

我的适配器代码:

public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.ViewHolder> {
    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()));

关于java - 在 RecyclerView.Adapter 中单击时传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33242626/

相关文章:

java - 单击监听器在 BufferedImage 和 Icon 上返回错误

SceneBuilder 中的 JavaFX 和 TableView

java - 级联持久化和现有对象

java - 如何制作 LibGDX + Android Studio jar 文件?

android - 从 URL 在 Google Maps v2 Android 上设置标记图标

android - 动画移除 fragment

java - HikariCP 1.4.0 MBean InstanceNotFoundException

android - 如何在原生 Android 应用程序开发中使用 OpenStreetMap

java - 为什么findFragmentById总是返回null

android - 返回堆栈中存在大量 fragment 的内存问题