onClick里面ViewHolder无权访问适配器中的点击项

时间:2016-09-14 14:20:27

标签: android android-recyclerview onclicklistener android-viewholder

1)问题

我想在CardView内的2个按钮上设置2个侦听器。我需要知道选择了哪个项目。我将CardView与RecyclerView和FirebaseRecyclerAdapter(RecyclerView.Adapter)一起使用

2)旧情况

我在FirebaseRecyclerAdapter的populateViewHolder()中创建了一个监听器,如下所示:

@Override
protected void populateViewHolder(final ItemViewHolder viewHolder, final Item model, final int position) {

    viewHolder.firstButton.setOnClickListener(new View.OnClickListener() {
        Item selectedItem = getItem(position);
        //do something for the item selected
    }

}

这很好用!

3)我想做什么

在ViewHolder类中设置侦听器(在他自己的文件中定义)并在选定的ITEM上执行某些操作

我想在ViewHolder类中设置侦听器,因为相同的ViewHolder用于不同的适配器,我认为这是一种更好的方法,只能在一个地方定义侦听器的行为。

我确实喜欢这个:

public class ItemViewHolder extends RecyclerView.ViewHolder {

    public CardView cardView;
    public TextView itemText;
    public ImageView itemFirstButton;
    public ImageView itemSecondButton;

    public ItemViewHolder(View itemView) {
        super(itemView);
        cardView = (CardView)itemView.findViewById(R.id.item_card_view);
        itemText = (TextView)itemView.findViewById(R.id.item_text);
        itemFirstButton = (ImageView)itemView.findViewById(R.id.ic_first_action);
        itemSecondButton = (ImageView)itemView.findViewById(R.id.ic_second_action);

        itemFirstButton.setOnClickListener(firstListener);
        itemSecondButton.setOnClickListener(secondListener);
    }


    private View.OnClickListener firstLinstener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position =  getAdapterPosition();
        }
    };

    private View.OnClickListener secondListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = getAdapterPosition();
        }
    };
}

在听众中我无法获得任何关于该项目的参考,只有位置......

我的印象是我必须为侦听器声明一个接口并传递给适配器,但我不知道如何。

在viewholder中声明监听器还是将它们作为旧解决方案保存在适配器中仍然有意义吗?

2 个答案:

答案 0 :(得分:0)

如果你想告诉适配器你的位置,只需通过ViewHolder构造函数传递一些接口。 要么 以前的方式。

关键是您要将职位委派给谁。

答案 1 :(得分:0)

是的,使用界面是一种好习惯。创建一个像

这样的界面
public interface OnClick {
    void getItem(int item);
}

然后像

那样设置setOnClicklistner
itemViewHolder. itemText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                OnClick onClick = (OnClick)context;
                onClick.getItem(position);
            }
        });

然后在您的活动中实现该方法。从这个你得到的位置。然后使用position,从数组中获取元素。