在回收视图适配器中实现对多个视图持有人类型的视图单击



我正在实现多个视图持有者,如本答案中的建议,该答案使用抽象bind()。我目前的AdapterViewHolder如下所示:

// MyAdapter.java
{adapter code}
public static abstract class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(View itemView) {
super(itemView);
}
protected abstract void bind(MyModel item);
}
// ViewHolder1.java
public class ViewHolder1 extends MyAdapter.MyViewHolder implements View.OnClickListener {
TextView textView;
public ViewHolder1(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
textView.setOnClickListener(this);
}
@Override
protected void bind(MyModel item) {
textView.setText(item.getText());
}
@Override
public void onClick(View view) {
//pass the current item position back to adapter
}
}

如何将单击项目的位置从此处传递回适配器。我不希望在bind()内设置onClickListener(),因为当我的RecyclerView滚动时,它会被多次调用。

对不起 Kotlin,但你应该能够轻松地将其翻译成 Java。

将单击回调接口添加到 ViewHolder 构造函数。在构造函数(Kotlin 中的 init 块(中,在 itemView 上设置 View.OnClickListener。

class ViewHolder(
itemView: View,
clickCallback: (position: Int) -> Unit
) : RecyclerView.ViewHolder(itemView) {
init {
itemView.setOnClickListener {
clickCallback(layoutPosition)
}
}
}

创建 ViewHolder 时,请创建单击回调接口(在本例中为 clickCallback lambda(的匿名实现,该接口提供所单击行的位置。在这种情况下,它使用位置在给定位置获取适配器项。

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
itemView = LayoutInflater.from(parent.context)
.inflate(R.layout.action_list_item, parent, false),
clickCallback = { position ->
clickCallback(getItem(position))
}
)
}
class Adapter(private val clickCallback: (item: *YOUR_DATA_CLASS*) -> Unit)
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
viewHolder.btnPlus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// btn plus 
}
});
viewHolder.btnMinus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// button minus
}
});
}
public class ViewHolder extends RecyclerView.ViewHolder
{
Button btnPlus, btnMinus;   
public ViewHolder(@NonNull View itemView)
{
super(itemView);
btnPlus = itemView.findViewById(R.id.plusbutton);
btnMinus = itemView.findViewById(R.id.minusbtn);
}
}

相关内容

  • 没有找到相关文章

最新更新