RecyclerView跳转后获取位置为0而非对应项位置的问题
为啥RecyclerView跳转后拿到的position始终是0?
兄弟,我太懂这种踩坑的憋屈感了——点不同条目跳过去,结果Toast永远显示Position:0,简直让人怀疑人生!咱们一步步揪出问题根源:
最常见的坑:传参时没拿到正确的position
这绝对是90%的情况!你得先去RecyclerView的Adapter里检查跳转逻辑,是不是传参的时候写错了position:
- 错误示范(写死0或者用错变量):
holder.itemView.setOnClickListener { val args = NextFragmentArgs.Builder() .setPosition(0) // 这里直接写死0,肯定每次都拿到0! .build() findNavController().navigate(R.id.action_to_next, args.toBundle()) } - 正确姿势:用
holder.adapterPosition或者onBindViewHolder的position参数:holder.itemView.setOnClickListener { val args = NextFragmentArgs.Builder() .setPosition(holder.adapterPosition) // 这里要对应当前条目的真实位置 .build() findNavController().navigate(R.id.action_to_next, args.toBundle()) }
导航组件的参数配置问题
去你的navigation.xml里看看对应Action的参数设置:
- 有没有给
position设置了默认值0?如果有,而你传参时没覆盖这个值,就会一直用默认的0。 - 确认
<argument>标签的argType是integer,类型不匹配也可能导致参数获取异常:<action android:id="@+id/action_current_to_next" app:destination="@id/nextFragment"> <argument android:name="position" app:argType="integer" app:nullable="false"/> <!-- 别加默认值,或者确保传参时覆盖 --> </action>
Fragment实例复用/参数重置问题
- 如果你是手动new NextFragment而不是用导航组件跳转,有没有每次都传入新的Bundle?要是复用了旧的Fragment实例,参数肯定不会更新。
- 检查NextFragment里有没有在
onCreate之前就调用了获取position的代码,这时候getArguments()可能还没初始化,拿到的就是默认值0。
最后验证一下Bundle内容
可以在NextFragment里先打印一下Arguments的内容,确认参数是不是真的传过来了:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d("NextFragment", "传入的参数:${arguments?.getInt("position")}") // 再用Args解析 val position = NextFragmentArgs.fromBundle(requireArguments()).getPosition() Toast.makeText(context, "Position: $position", Toast.LENGTH_SHORT).show() }
先从「传参是否正确」开始排查,这是最容易翻车的地方!
内容的提问来源于stack exchange,提问作者Kevin Kyei
相关产品推荐
相关产品推荐

