Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在RecyclerView.Adapter中单击时传递数据_Java_Android_Android Fragments_Android Adapter_Android Recyclerview - Fatal编程技术网

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

Java 在RecyclerView.Adapter中单击时传递数据,java,android,android-fragments,android-adapter,android-recyclerview,Java,Android,Android Fragments,Android Adapter,Android Recyclerview,我的片段上有一个RecyclerView,显示了我从FTP服务器加载的某些文件。 我试图为每个项目设置一个onClickListener,因此当单击它时,将显示一个对话框片段,用户可以在其中选择是下载还是打开文件。 我的问题是: 我需要向我的对话发送2件东西: 目标片段,用户选择要执行的操作后,该片段将下载/打开文件。使用setTargetFragment()很容易做到这一点,唯一的问题是我无法访问我的RecyclerView.ViewHolder中的片段 要下载/打开的文件的名称。这样对话框将

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

  • 目标片段,用户选择要执行的操作后,该片段将下载/打开文件。使用
    setTargetFragment()
    很容易做到这一点,唯一的问题是我无法访问我的
    RecyclerView.ViewHolder
    中的片段
  • 要下载/打开的文件的名称。这样对话框将把它发送到目标片段。这里的问题是,我无法访问
    RecyclerView.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;
            }
        }
    
    }
    
     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");
            }
        }
    
    holder.setOnClickListener(new downloadOnClickListener(fragment, dataset[position].getName()));
    
    公共类FileAdapter扩展了RecyclerView.Adapter{ public final String TAG=“FILES\u ADAPTER”; 私有FTPFile[]数据集; //一些方法和材料。。。 公共静态类ViewHolder扩展了RecyclerView.ViewHolder{ 公共最终字符串TAG=“FILES\u VH”; 私有最终文本视图名称文本视图; 私有最终文本视图信息文本视图; 私人最终影像视图; 公共视图持有者(视图v){ 超级(五); //定义ViewHolder视图的单击侦听器。 v、 setOnClickListener(新视图。OnClickListener(){ @凌驾 公共void onClick(视图v){ d(标记“Element”+getPosition()+“clicked”); //在这里,我想打开对话框片段并开始下载/打开 } }); nameTextView=(TextView)v.findViewById(R.id.fileNameTextView); infoTextView=(TextView)v.findViewById(R.id.fileInfoTextView); imageView=(imageView)v.findViewById(R.id.fileImageView); } 公共文本视图getNameTextView(){ 返回nameTextView; } 公共图像视图getImageView(){ 返回图像视图; } 公共文本视图getInfoTextView(){ 返回infoTextView; } } }

    非常感谢您的帮助。

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

    视图持有者:

    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;
            }
        }
    
    }
    
     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");
            }
        }
    
    holder.setOnClickListener(new downloadOnClickListener(fragment, dataset[position].getName()));
    
    我的自定义侦听器:

    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;
            }
        }
    
    }
    
     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");
            }
        }
    
    holder.setOnClickListener(new downloadOnClickListener(fragment, dataset[position].getName()));
    
    并在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;
            }
        }
    
    }
    
     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");
            }
        }
    
    holder.setOnClickListener(new downloadOnClickListener(fragment, dataset[position].getName()));
    

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

    视图持有者:

    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;
            }
        }
    
    }
    
     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");
            }
        }
    
    holder.setOnClickListener(new downloadOnClickListener(fragment, dataset[position].getName()));
    
    我的自定义侦听器:

    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;
            }
        }
    
    }
    
     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");
            }
        }
    
    holder.setOnClickListener(new downloadOnClickListener(fragment, dataset[position].getName()));
    
    并在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;
            }
        }
    
    }
    
     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");
            }
        }
    
    holder.setOnClickListener(new downloadOnClickListener(fragment, dataset[position].getName()));
    

    onClick(View v)
    中,您可以调用
    v.getLayoutParams()
    并将结果强制转换为
    RecyclerView.LayoutParams
    这对我有什么帮助?检查了我正在谈论的类的文档?是的,但它只帮助通过getAdapterPosition()获得位置,我仍然无法访问实际数据。然后在
    onCreateViewHolder
    内部设置
    OnClickListener
    onCreateViewHolder
    适配器的一部分,您可以访问数据模型,在Adapter中,您还可以调用
    RecyclerView#getChildAdapterPosition
    /
    RecyclerView#getChildLayoutPosition
    ,因此无需在
    onClick(视图v)
    中使用
    LayoutParams
    ,您可以调用
    v.getLayoutParams()
    并将结果转换到
    RecyclerView.LayoutParams
    这对我有什么帮助?检查了我所说的类的文档?是的,但它只帮助通过getAdapterPosition()获取位置,我仍然无法访问实际数据。然后在
    onCreateViewHolder
    中设置
    OnClickListener
    onCreateViewHolder
    是您的
    适配器的一部分,您可以在适配器中访问数据模型,也可以在适配器中调用
    RecyclerView\getChildAdapterPosition
    /
    RecyclerView\getChildLayoutPosition
    ,因此无需使用
    LayoutParams