1

1)问题的onClick内ViewHolder没有获得点击的项目适配器

我想设置一个CardView内的2个按钮2个监听器。我需要知道哪个项目已被选中。我用CardView与RecyclerView和FirebaseRecyclerAdapter我FirebaseRecyclerAdapter的(RecyclerView.Adapter)

2)老样子

我在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类(在自己的文件中定义),并做一些对所选项目

我想设置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(); 
     } 
    }; 
} 

听众,我不能得到关于该项目,只是位置的任何引用里面...

我的印象中我要申报一个监听器的接口并传递给适配器,但我不知道如何。

在视图中声明侦听器还是将它们保存在适配器中作为旧解决方案还有意义吗?

+0

Nop。当您需要适配器的某些东西时,将侦听器放入ViewHolder中对我来说没有任何意义。由于视图在滚动过程中不断被破坏并重新创建,因此您需要在onBind中定义它。如果你的监听器做了一些通用的事情,而不依赖于任何适配器数据,那么把它放在viewHolder中是有意义的。 – Panther

+0

嗨Panther,我的听众做一些依赖于项目的东西(例如点击一个按钮我想分享项目数据)。对于使用相同ViewHolder的2个不同适配器,共享操作具有相同的行为。所以,如果我很好理解你建议将听众保持在适配器内...... – DavideN

+0

是的,我建议你将听者保持在适配器内。但是,由于您提到的行动是相同的,我相信您正在尝试达成DRY解决方案。我会在你的情况下做的是写一个共同的功能来执行所有的股份。监听者只是一个代理人,他将使用适当的数据调用共享操作。 – Panther

回答

0

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

重点是你想要将这个职位委托给谁。

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); 
      } 
     }); 

然后在你的活动实施该方法。从这里你得到的位置。然后通过使用位置从数组中获取元素。

+0

嗨,谢谢你的回答...对不起,但我不清楚如何去做。我是否必须在适配器上设置侦听器? 假设我想在ViewHolder中定义一个可以实现共享操作以共享所选项目数据的监听器(因此onClick行为应该在ViewHolder中定义)。我怎样才能将项目从适配器传递给ViewHolder? – DavideN

相关问题