【问题标题】:How to access a TextView outside RecyclerView in Android?如何在 Android 中访问 RecyclerView 之外的 TextView?
【发布时间】:2020-09-09 08:44:19
【问题描述】:

根据图片,在我的主要活动中,我使用了一个片段,在这个片段内有一个水平的 RecyclerView,有一些 CardView(下图中显示了 4 个)。 TextView 在父片段上的 RecyclerView 之外。我想要的是,从 RecyclerView 访问 TextView,即如果我单击 RecyclerView 内的卡片,相应的卡片文本将显示在 TextView 中。

示例:如果单击 CardView2,TextView 文本将为“card2”....如果单击 CardView3,TextView 文本将为“card3”

这是我的适配器类:

public class ScanCodeSliderAdapter extends RecyclerView.Adapter<viewHolder> {

    private List<ScanCodeCardModel> scanCodeCardModels;
    private Context context;


    public ScanCodeSliderAdapter(List<ScanCodeCardModel> scanCodeCardModels, Context context) {
        this.scanCodeCardModels = scanCodeCardModels;
        this.context = context;
    }

    @NonNull
    @Override
    public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_scan_code_card_item, parent, false);
        return new viewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final viewHolder holder, final int position) {
       
        holder.scanCodeSingleItemCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Toast.makeText(context, ""+position, Toast.LENGTH_SHORT).show();

            }
        });
    }

    @Override
    public int getItemCount() {
        return scanCodeCardModels.size();
    }

}

这是我的 ViewHolder 类:

public class viewHolder extends RecyclerView.ViewHolder {

    public CardView scanCodeSingleItemCardView;

    public viewHolder(@NonNull View itemView) {
        super(itemView);
        
        scanCodeSingleItemCardView = itemView.findViewById(R.id.scanCodeSingleItemCardView);
    }


}

我还可以在这里添加什么来做到这一点?

【问题讨论】:

  • 在每个卡片视图中添加一个点击监听器并通过回调或其他方式进行管理

标签: android android-recyclerview textview fragment


【解决方案1】:

最好的方法是通过点击监听器,它允许您在 RecyclerView 项目和回收站视图之外的小部件或视图之间建立通信。

要设置监听器,您可以使用此示例作为指导:

interface OnItemsClickListener{
     void onItemClick(ScanCodeCardModel scanCodeCardModels);
}

然后在你的适配器类中创建一个监听器变量:

private OnItemsClickListener listener  = null;

还有一个公共方法,它将像这样处理或在您的活动或片段与 RecycerView 适配器之间进行侦听

void setOnItemClickListener(OnItemsClickListener listener){
     this.listener = listener;
}

现在回到 onClick() 覆盖方法中的 onBindViewHolder

 @Override
public void onBindViewHolder(@NonNull final viewHolder holder, final int position) {
   
    ScanCodeCardModels item =  scanCodeCardModels[position]

    holder.scanCodeSingleItemCardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           // Toast.makeText(context, ""+position, Toast.LENGTH_SHORT).show();
           if(listener != null){
               listener.onItemClick(item)
           }
        }
    });
}

这就是您在 Adapter 类中需要做的所有事情。 然后继续你的片段或活动课程, 并连接到监听器

adapter.setOnItemClickListener(new AdapterName.OnItemClickListener(){
      @Override
      public void onItemClick(ScanCodeCardModel scanCodeCardModels){
           //Set your TextView here when card is Clicked on
           textView.setText(scanCodeModels.name)
      }
})

仅此而已。

【讨论】:

  • 谢谢,这正是我想要的。不过还有一个问题...... '''if(listener != 0){listener.onItemClick(item);}''' 中实际发生了什么。
  • 首先,条件是确保监听器已经初始化并且它不为空,当这是真的时,我们调用 onItemClick(item) 传递我们当前选择的项目作为监听这个的活动的参数事件利用
  • @JeetNath 你可以在这里阅读更多内容antonioleiva.com/recyclerview-listener
【解决方案2】:

尝试添加将通过 findViewById 访问 TextView 对象并在其上设置文本的 onclick 方法。 OnClick 方法将具有 View 视图属性,因此您可以使用它来了解单击了哪个元素。

您还应该为您的回收站视图添加某种数组适配器,您可以在其中添加一些将 mainactivity 用作侦听器的 onclick 方法。

【讨论】:

    【解决方案3】:

    在片段类中创建一个公共方法。参数为字符串。
    现在在 recyclerview textview 下单击。使用其上下文调用片段类方法。例如。 context.methodName(参数)。
    并使用参数进入公共方法设置 textview 文本。

    【讨论】:

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