【问题标题】:RecyclerView Child Item Click in onBindViewHolder()RecyclerView子项点击onBindViewHolder()
【发布时间】:2023-04-04 02:51:01
【问题描述】:

我有一个 RecyclerView 和一个类似的按钮。例如,我想在单击按钮时发送 Toast 消息。示例代码:

class ViewHolder extends RecyclerView.ViewHolder{

    Button button;

  public ViewHolder(@NonNull View itemView) {
    super(itemView);

    button = itemView.findViewById(R.id.button);

    }
}

 @Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {

     holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Toast.makeText(context, ""+list.get(position).getId(), Toast.LENGTH_SHORT).show();
        }
    });

}

那么这种方式正确吗?由于性能问题,我不确定这必须在 onBindViewHolder() 内部吗?那么你能告诉我RecyclerView中的子项点击事件有更好的方法吗?顺便说一句,这些只是示例代码。实际上,当我单击按钮(请求服务器)时,我正在处理更复杂的事情。

【问题讨论】:

    标签: android android-recyclerview android-button


    【解决方案1】:

    @Kasim Özdemir 现在我的代码如下:

    class ViewHolder extends RecyclerView.ViewHolder{
    
    Button button;
    
    public ViewHolderMultiple(@NonNull View itemView) {
      super(itemView);
    
        like_button = itemView.findViewById(R.id.like_button);
        comment_button = itemView.findViewById(R.id.comment_button);
    
         like_button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    RecyclerViewClicksUtils.likeClick(context,list,getAdapterPosition());
                }
            });
    
          comment_button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    RecyclerViewClicksUtils.likeClick(context,list,getAdapterPosition());
                }
            });
         }
    
          //I write other codes in RecyclerViewClicksUtils to avoid complexity in Adapter
    
     public static void likeClick(final Context context, final List<PostDetailsPojo> list, 
     final int position){
    
        Toast.makeText(context, ""+list.get(position).getId(), Toast.LENGTH_SHORT).show();
    }
    

    我希望这一定是正确的。

    【讨论】:

    • 是的,没错。在此之后,您可以创建一个接口。您可以收听您的活动或片段。我希望我的项目对你有所帮助。祝你好运...
    【解决方案2】:

    你可以这样做:

    class ViewHolder extends RecyclerView.ViewHolder{
    
    Button button;
    
    public ViewHolderMultiple(@NonNull View itemView) {
      super(itemView);
    
      button = itemView.findViewById(R.id.button);
    
      button.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View view) {
       Toast.makeText(context, ""+list.get(getAdapterPosition()).getId(), Toast.LENGTH_SHORT).show();
        }
    }
    

    【讨论】:

    • 感谢您的回答。你能解释一下这和我的有什么区别吗?那么这对性能更好还是对内存更友好?
    • 从查看器上下文设置事件不是一个有用的应用程序。不要错过 onBindViewHolder 被调用,因为你的 recyclerview 在滚动期间被填充。这样,您将多次调用 setOnClickListener。一次又一次。
    • 但我无法从 ViewHolder 访问列表。因为我有 2 个 ViewHolder(用于不同的视图)并且它们在我的 RecyclerViewAdapter 之外。我只能从适配器到达列表,所以 onBindViewHolder()。
    • 没关系。你可以看看我的adapter。我有两个视图持有者。标题和项目。我添加了其中一个听众。如果我愿意,我会同时添加。
    • resource1resource2resource3。 Java 建议使用嵌套类。但是内存泄漏没有任何确定性。使用静态类一直是一个建议。
    【解决方案3】:

    进行更改:

    holder.button.layout....

    您需要获取该持有者的实例并将其放置在您的视图中,以便为每个按钮单击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多