问题描述
在安卓中,使用RecyclerView时,它的getAdapterPosition()方法已弃用,不能通过此方法来获取当前用户点击的位置了。
如下所示(Kotlin版):
val position=viewHolder.adapterPosition
(Java版):
int position = viewHolder.getAdapterPosition();
废弃原因
当适配器嵌套其他适配器时,此方法容易导致混淆。
解决方案
使用getBindingAdapterPosition()方法,或者getAbsoluteAdapterPosition()方法,都可以。
- getBindingAdapterPosition()方法:获取与绑定的适配器位置相对应的位置。
- getAbsoluteAdapterPosition()方法:获取RecyclerView视图中的绝对适配器位置。
示例代码如下,这里使用的是Kotlin:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view=LayoutInflater.from(parent.context)
.inflate(R.layout.task_item,parent,false)
val viewHolder=ViewHolder(view)
viewHolder.itemView.setOnClickListener{
val position=viewHolder.bindingAdapterPosition
val task=taskList[position]
//……
}
viewHolder.taskIcon.setOnClickListener{
val position=viewHolder.absoluteAdapterPosition
val task=taskList[position]
//……
}
return viewHolder
}
以下是Java版示例:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.task_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = viewHolder.getBindingAdapterPosition();
Task task = taskList.get(position);
// ...
}
});
viewHolder.taskIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = viewHolder.getAbsoluteAdapterPosition();
Task task = taskList.get(position);
// ...
}
});
return viewHolder;
}