在Recyclerview中有许多方法可以处理单击事件,但是就性能和减少错误而言,我不知道最好的方法。
我看到的第一种方法是处理onBindViewHolder
方法中的点击事件
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int postion) {
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Add action
}
});
}
第二种方法是处理onCreateViewHolder
方法
@Override
public Viewholder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(item_adapter, parent, false);
final ViewHolder holder = new ViewHolder(v);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Add action
}
});
return holder;
}
第三种方法正在使用接口并将信息发送到MainActivity
或片段,并处理MainActivity
或片段中的click事件。
哪种方法更好?
答案 0 :(得分:1)
在ViewHolder类+接口中处理click事件是遵循的最佳实践。
这里是一个示例
interface ClickListener{
fun onItemClick(position:Int,item:Forecast)
}
var clickListener:ClickListener?= null
inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
{
init {
itemView.r_forecast_tv_forecast.setOnClickListener {
val position = adapterPosition
val model = data[position]
clickListener?.onItemClick(position,model)
}
}
}
答案 1 :(得分:0)
我更喜欢的干净方法是在onBindViewHolder中为项目设置标签,并在View类中接收相同的标签数据。
@Override
public void onBindViewHolder(myViewHolder viewHolder, int position) {
viewHolder.button.setTag(position); //Here we are setting a position integer
viewHolder.button.setTag(object); //set any custom object this way
}
在您的“视图/活动/片段”类中接收标签并获取数据
@Override
public void onClick(View view) {
int position = (int) view.getTag();
Log.e("DEMO","Position"+position)
if(view.getTag() instanceOf Object) {
Object object = (Object) view.getTag();
Log.e("DEMO","Position"+obect.getName())
}