You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过子项获取嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:35:22