【问题标题】:how can I pass data from recyclerview click to a fragment which is inside the same activity in which my recyclerview is placed?如何将数据从 recyclerview 单击传递到放置我的 recyclerview 的同一活动内的片段?
【发布时间】:2023-03-14 13:50:01
【问题描述】:
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);

                    }
                });

【问题讨论】:

  • 我想将模型类中的数据显示到同一活动中的片段
  • 在其中创建一个接口和方法,它将返回 itemList 或您要传输的数据。并在您的片段中实现该接口。
  • 能否以代码的形式给出一些提示?
  • 我已经发布了一个例子跟随这个。

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


【解决方案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));
    }
});

【讨论】:

    【解决方案2】:

    您可以将这个用于单视图和多视图点击

    适配器查看器类 公共类 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;
    

    【讨论】:

      【解决方案3】:

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

      创建一个动作监听器

       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
      }
      

      希望这会奏效。

      【讨论】:

        猜你喜欢
        • 2021-01-12
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 2022-07-07
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多