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

Android中如何在RecyclerView.ViewHolder的onCreate中获取适配器位置

解决RecyclerView onCreate阶段无法获取适配器位置的问题

在onCreateViewHolder方法里,你调用的getBindingAdapterPosition()、getAbsoluteAdapterPosition()等方法无法拿到有效位置,核心原因是:此时ViewHolder还未与任何具体的数据集位置绑定,这些方法会返回RecyclerView.NO_POSITION(值为-1),自然无法获取到你需要的位置信息。

正确的处理方式

  • 数据绑定逻辑移到onBindViewHolder:这个方法的参数直接提供了当前的position,且此时ViewHolder已经和具体位置完成关联,是安全获取数据的正确时机:
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // 仅负责创建ViewHolder,不处理位置相关逻辑
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.tfl_conversation_item, parent, false);
    return new ConversationAdapter.ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ConversationAdapter.ViewHolder holder, int position) {
    // 直接使用position获取对应数据
    ConversationItem conversation = conversations.get(position);
    // 执行视图绑定操作,比如:
    // holder.tvContent.setText(conversation.getContent());
}
  • 若需基于位置创建不同视图:用getItemViewType区分:如果你的需求是根据位置创建不同样式的ViewHolder,不要直接在onCreateViewHolder里获取位置,而是通过getItemViewType提前返回类型标识:
@Override
public int getItemViewType(int position) {
    // 根据位置返回自定义的视图类型,示例:奇数位置返回1,偶数返回0
    return position % 2 == 0 ? 0 : 1;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // 根据viewType加载对应布局
    int layoutRes = viewType == 0 ? R.layout.tfl_conversation_item : R.layout.tfl_conversation_item_special;
    View view = LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false);
    return new ConversationAdapter.ViewHolder(view);
}

内容的提问来源于stack exchange,提问作者Muhammad Abdullah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:40:59