0

我有一个RecyclerView我的片段,显示我从FTP服务器加载某些文件。 我试图为每个项目设置一个onClickListener,因此当它被点击时,会显示一个DialogFragment,用户可以选择是否下载或打开文件。
我的问题是:
我需要发送到我的对话框两件事情:传递数据点击RecyclerView.Adapter

  1. 目标片段,这将下载/用户选择做什么后打开该文件。这可以很容易不setTargetFragment(),唯一的问题是我没有访问我的RecyclerView.ViewHolder内的片段。
  2. 要下载/打开的文件的名称。这样对话框将把它发送到目标片段。这里的问题是我没有访问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; 
     } 
    } 

} 

帮助将非常感激,感谢。

+0

? – pskink

+0

怎么这么想帮助我 –

+0

检查了我正在谈论的课程文档? – pskink

回答

4

所以我找到了一个解决方案,我创建了一个自定义的OnClickListeneronBindViewHolder()与匹配参数,并将其设置为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"); 
     } 
    } 

和邻nBindViewHolder()添加以下代码:

holder.setOnClickListener(new downloadOnClickListener(fragment, dataset[position].getName())); 
在`的onClick(视图v)`你可以调用`v.getLayoutParams()`和投结果为`RecyclerView.LayoutParams`
相关问题