如何将数据从recyclerview点击传递到片段中,该片段位于放置recyclerview的同一活动中?

时间:2019-12-05 07:28:13

标签: android android-fragments android-activity android-recyclerview

public void onBindViewHolder(@NonNull final myViewHolder holder, final int position) {

            holder.tvItem.setText(itemList.get(position).getmTitle());
            Picasso.get().load(itemList.get(position).geturl()).into(holder.imgFlag);
                holder.cardView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        final ModelClass model= itemList.get(position);

                    }
                });

3 个答案:

答案 0 :(得分:1)

以下是一个示例,您可以按照自己的要求进行操作并使其符合您的要求-

在适配器中创建接口

public interface OnItemClickListener {
  void onItemClicked(int position, Object object);
}

在您的适配器呼叫中

Adapter adapter = new Adapter(context, list, new Adapter.OnItemClickListener() {
            @Override
            public void onItemClicked(int position, Object object) {
                  // Handle Object of list item here
            }
        });

在适配器上

 private OnItemClickListener onItemClickListener; // Global scope 

在构造函数调用中:

this.onItemClickListener = onItemClickListener;

关于您的项目点击事件:

itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      onItemClickListener.onItemClicked(position, _list.get(position));
    }
});

答案 1 :(得分:0)

您可以将此视图用于单视图和多视图单击

适配器查看器类       公共类MyViewHolder扩展了RecyclerView.ViewHolder的实现
      View.OnClickListener {

        CircleImageView imgPlayer;
        TextView playerRole;


        public MyViewHolder(View itemView) {
            super(itemView);

            imgPlayer = itemView.findViewById(R.id.trnmt_player);
            playerRole = itemView.findViewById(R.id.pRole_id);

            playerRole .setOnClickListener(this);
            imgPlayer.setOnClickListener(this);


        }

        @Override
        public void onClick(View v) {

            if (v == imgPlayer) {

          onItemClickListener.onItemClicked(position,list.get(position));

                } else if(v==playerRole){

                  }

        }
      }
   }

界面

   public interface OnItemClickListener {
   void onItemClicked(int position, Object object); 
          }

内部适配器

      private OnItemClickListener onItemClickListener;

答案 2 :(得分:0)

如果提供一些代码快照,将会很有帮助。
尽管您可以在活动的“回收者”视图上获得单击操作的回调。因此,为此,您需要创建自己的侦听器并将其设置为“自定义”适配器。

创建动作侦听器

 public interface ActionListener<T> {
     void onClickAction(int positionOfItem, T object);//here T will be the type of object bound to your view.
 }

现在在您的自定义适配器中创建一个方法来设置此侦听器

private ActionListener mListener;

public void setActionListener(ActionListener listener){
     mListener = listener;
}

现在使用此侦听器从适配器导航回叫。

public void onBindViewHolder(@NonNull final myViewHolder holder, final int position) {

            holder.tvItem.setText(itemList.get(position).getmTitle());


Picasso.get().load(itemList.get(position).geturl()).into(holder.imgFlag);
            holder.cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final ModelClass model= itemList.get(position);
                    listener.onClickAction(position, model);//this will pass the call to the listener.
                }
            });

}

现在在刚刚创建适配器实例的活动类中将侦听器设置为适配器。在这里,您需要在片段中调用一个方法。要获取片段,可以使用findFramgentById() or findFragmentByTag()方法。

adapter.setActionListener(new ActionListener<ModelClass>(){
    void onClickAction(int positionOfItem, ModelClass object){
         MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag();
         fragment.updateActionData(object);
    }
});

请在您的片段中创建一个方法,如下所示:

public void updateActionData(ModelClass object){
     //to do your work with object
}

希望这会起作用。