如何从另一个Adapter类访问onBindViewHolder中弹出的BottomSheetDialog内的EditText
问题根因
itemView.getRootView().getContext()返回的是Context类型的实例,和DataAdapter_Questions没有继承关系,强制类型转换必然失败。- 你原代码中的
etReport是onBindViewHolder点击事件内的局部变量,就算你拿到了DataAdapter_Questions的实例,也无法直接访问这个局部变量。
解决方案(推荐接口回调解耦)
该方案不会产生额外耦合,是Android跨组件通信的常规实现方式。
步骤1:修改第二个Adapter,添加回调接口
针对包含bindData方法的Adapter做如下改造:
public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.ViewHolder> { // 定义回调接口 public interface OnReplyClickListener { void onReplyClick(String replyPrefix); } private OnReplyClickListener onReplyClickListener; // 对外暴露设置监听的方法 public void setOnReplyClickListener(OnReplyClickListener listener) { this.onReplyClickListener = listener; } void bindData(final MovieModel movieModel){ tvReply.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击时触发回调,把要设置的内容传出去 if (onReplyClickListener != null) { onReplyClickListener.onReplyClick(movieModel.submitted_by + ","); } } }); } // 其他原有代码省略 }
步骤2:修改DataAdapter_Questions,关联回调逻辑
public class DataAdapter_Questions extends RecyclerView.Adapter<DataAdapter_Questions.MyViewHolder> { // 把EditText提升为成员变量 private EditText etReport; private Context context; // 原有初始化等代码省略,在你初始化第二个Adapter的位置设置回调 private void initMovieAdapter() { MovieAdapter movieAdapter = new MovieAdapter(); // 设置回调监听 movieAdapter.setOnReplyClickListener(new MovieAdapter.OnReplyClickListener() { @Override public void onReplyClick(String replyPrefix) { // 直接给成员变量etReport设置内容 if (etReport != null) { etReport.setText(replyPrefix); // 可选:把光标移到文字末尾方便用户后续输入 etReport.setSelection(etReport.getText().length()); } } }); // 其他movieAdapter的设置逻辑省略 } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.img_arrow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final BottomSheetDialog dialog3 = new BottomSheetDialog(context); dialog3.setContentView(R.layout.bcs_report_bottomsheet); // 给成员变量赋值 etReport = (EditText) dialog3.findViewById(R.id.etReport); // 可选:Dialog关闭时清空引用避免内存泄漏 dialog3.setOnDismissListener(dialog -> etReport = null); dialog3.show(); } }); } // 其他原有代码省略 }
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

