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