【问题标题】:Pass the data from Recyclerview adapter to Fragment将数据从 Recyclerview 适配器传递到 Fragment
【发布时间】:2017-11-23 17:32:35
【问题描述】:

在我的片段类中

    public class ReceiveFragment extends Fragment implements ReceiverRecyclerViewAdapter.OnItemClick {

btnGenAddress.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {


                    linearLayoutMyWalletInfo.setVisibility(View.VISIBLE);
                    linearLayoutGenAddress.setVisibility(View.GONE);

                recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails,this);

                recyclerViewCardContainer.setAdapter(recyclerViewAdapter);



            }
        });

@Override
    public void onClick(String value) {

    }

在 ReceiverRecyclerViewAdapter 类中,我创建了一个接口,现在当我在片段中写入 recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails,this); } 当我使用 "this" 参数时,它会给出编译时间错误。

还有我的 ReceiverRecyclerViewAdapter 类

    public class ReceiverRecyclerViewAdapter extends RecyclerView.Adapter<ReceiverRecyclerViewAdapter.ViewHolder>{
     private OnItemClick mCallback;


    public ReceiverRecyclerViewAdapter(Context context1,String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener){

            SubjectValues = SubjectValues1;
            EmailValues2 = SubjectValues2;

            context = context1;
            this.mCallback = listener;
        }

  public interface OnItemClick {
        void onClick(String value);
    }

  itemView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    // get position
                    int pos = getAdapterPosition();

                    // check if item still exists
                    if(pos != RecyclerView.NO_POSITION){
                        String clickedDataItem = SubjectValues[pos];
                       Toast.makeText(v.getContext(), "You clicked " + clickedDataItem, Toast.LENGTH_SHORT).show();
                        mCallback.onClick(clickedDataItem);
                    }
                }
            });
    }

【问题讨论】:

标签: android android-fragments android-recyclerview


【解决方案1】:

您从片段中传递了 4 个参数,但您的构造函数需要 3 个。因此您需要添加 Context 作为适配器中的第一个参数。

更新:

您正在一个匿名类中传递this 实例,该类是OnClickListener,它没有实现该接口。所以不是这个,而是传递ReceiveFragment.this,这样你就可以引用实现接口的片段:

recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails, ReceiveFragment.this);

【讨论】:

  • 我已经编辑了代码,在原始代码中我传递并接收了 4 参数。请检查。
【解决方案2】:

问题是因为当您从 OnClickListener 传递 this 时,它传递的是 on click 实例而不是该接口。 您可以像下面的代码一样在您的片段中初始化您的接口,并将其传递给适配器。

OnItemClick onitemClick = (OnItemClick) this;

btnGenAddress.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {


                linearLayoutMyWalletInfo.setVisibility(View.VISIBLE);
                linearLayoutGenAddress.setVisibility(View.GONE);

            recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails,onitemClick);

            recyclerViewCardContainer.setAdapter(recyclerViewAdapter);
        }
    });


 public class ReceiverRecyclerViewAdapter extends RecyclerView.Adapter<ReceiverRecyclerViewAdapter.ViewHolder>{

   private OnItemClick mCallback;

    public ReceiverRecyclerViewAdapter(Context context, String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener){

        SubjectValues = SubjectValues1;
        EmailValues2 = SubjectValues2;

        this.context = context;
        this.mCallback = listener;
    } 

 public interface OnItemClick {
        void onClick(String value);
    }

  itemView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    // get position
                    int pos = getAdapterPosition();

                    // check if item still exists
                    if(pos != RecyclerView.NO_POSITION){
                        String clickedDataItem = SubjectValues[pos];
                       Toast.makeText(v.getContext(), "You clicked " + clickedDataItem, Toast.LENGTH_SHORT).show();
                        mCallback.onClick(clickedDataItem);
                    }
                }
            });
    }

【讨论】:

  • 这与问题无关。
  • @Raghunandan 试试看,他肯定会遇到这个问题。
  • 您应该仔细查看 riadrifai 的其他答案以及问题中的代码
  • 如果你从onclick传递这个,你认为它会传递接口实例吗?您甚至可以尝试创建演示人。
  • 这是一个不同的问题,因为它不是指 Fragment,而是传递给构造函数的参数是 4,而构造函数实际上有 3 个参数
【解决方案3】:

试试这个:

在适配器中:

public ReceiverRecyclerViewAdapter(Context context1,String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener)

在片段中:

  1. 创建一个对象:OnItemClick onItemClick;

  2. 在构造函数中:this.OnItemClick = onItemClick;

  3. 在适配器中传递这个对象。

活动中:

实现这个listner

【讨论】:

  • 注意与 op 面临的问题 ReceiverRecyclerViewAdapter(String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener) 构造函数有 3 个参数,但在传递时你有 4 个 (getActivity(),subjects, emails,this);
  • @Raghunandan 在投反对票之前,请检查答案。它将完美运行
猜你喜欢
  • 2021-05-11
  • 2021-05-12
  • 1970-01-01
  • 2017-01-18
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多