如何通过子项获取嵌套RecyclerView中的父项位置
嵌套RecyclerView子项点击获取父项位置解决方案
我正在开发嵌套RecyclerView,现有ParentItemAdapter、ChildItemAdapter类,以及对应的ParentItem、ChildItem数据类。已经掌握获取父项位置的方法,希望实现点击子项时获取其所属的父项位置,比如点击子项2时,通过Toast提示“您是父项位置1的子项”。
步骤1:定义子项点击回调接口
创建接口用于传递子项点击事件,携带父项位置和子项位置:
public interface ChildItemClickListener { void onChildItemClicked(int parentPosition, int childPosition); }
步骤2:修改ChildItemAdapter,添加回调支持
更新子适配器,添加父项位置存储和点击回调逻辑:
public class ChildItemAdapter extends RecyclerView.Adapter<ChildItemAdapter.ChildViewHolder> { private List<ChildItem> childItemList; private ChildItemClickListener clickListener; private int parentPosition; // 存储当前子项所属的父项位置 // 构造函数传入子项列表、父项位置和点击回调 ChildItemAdapter(List<ChildItem> childItemList, int parentPosition, ChildItemClickListener clickListener) { this.childItemList = childItemList; this.parentPosition = parentPosition; this.clickListener = clickListener; } @NonNull @Override public ChildViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_adopter_child_item, parent, false); return new ChildViewHolder(view); } @Override public void onBindViewHolder(@NonNull ChildViewHolder holder, int position) { ChildItem currentCard = childItemList.get(position); // 这里可设置子项UI内容,例如 holder.childText.setText(currentCard.getContent()); // 给子项设置点击监听,触发回调传递位置信息 holder.itemView.setOnClickListener(v -> { clickListener.onChildItemClicked(parentPosition, position); }); } @Override public int getItemCount() { return childItemList.size(); } static class ChildViewHolder extends RecyclerView.ViewHolder { // 定义子项控件,例如 TextView childText; public ChildViewHolder(@NonNull View itemView) { super(itemView); // 初始化控件,例如 childText = itemView.findViewById(R.id.child_text); } } }
步骤3:修改ParentItemAdapter,传递父项位置并处理回调
在父适配器中创建子适配器时,传入当前父项位置,并实现回调逻辑:
public class ParentItemAdapter extends RecyclerView.Adapter<ParentItemAdapter.ItemViewHolder> { private List<Parent_Item> itemList; public ParentItemAdapter(List<Parent_Item> itemList) { this.itemList = itemList; } @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_adopter_parent_item, parent, false); return new ItemViewHolder(view); } @Override public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { Parent_Item parentItem = itemList.get(position); holder.parent_tite.setText(parentItem.getText_titel()); // 创建子适配器,传入父项位置和点击回调 ChildItemAdapter childItemAdapter = new ChildItemAdapter( parentItem.getChildItemList(), position, (parentPos, childPos) -> { // 子项点击后弹出Toast提示 String message = "您是父项位置" + parentPos + "的子项"; Toast.makeText(holder.itemView.getContext(), message, Toast.LENGTH_SHORT).show(); } ); holder.parent_rec.setLayoutManager(new LinearLayoutManager(holder.itemView.getContext())); holder.parent_rec.setHasFixedSize(true); holder.parent_rec.setAdapter(childItemAdapter); // 保留原父项点击逻辑 holder.parent_rec.setOnClickListener(v -> notifyItemChanged(holder.getAdapterPosition())); } @Override public int getItemCount() { return itemList.size(); } static class ItemViewHolder extends RecyclerView.ViewHolder { TextView parent_tite; RecyclerView parent_rec; public ItemViewHolder(@NonNull View itemView) { super(itemView); parent_tite = itemView.findViewById(R.id.parent_tite); parent_rec = itemView.findViewById(R.id.parent_rec); } } }
关键说明
- 通过在子适配器中存储父项位置,结合回调接口实现了子项与父项位置的关联
- 回调方式解耦了父、子适配器的逻辑,符合Android开发最佳实践
- 补充了原代码缺失的
getItemCount()方法,保证适配器正常工作
内容的提问来源于stack exchange,提问作者Tech CS IT
相关产品推荐
相关产品推荐

