单击OnBindViewHolder中的侦听器

时间:2018-06-05 20:09:30

标签: java android clicklistener

我现在正在处理的Android应用程序的recyclerview适配器的代码如下:

 @Override
public void onBindViewHolder(final FeedViewHolder contactViewHolder, final int i) {

    final FeedInfo ci = feedInfoList.get(i);

    //Set the text of the feed with your data
    contactViewHolder.feedText.setText(ci.getFeed());
    contactViewHolder.surNameText.setText(ci.getSurName());
    contactViewHolder.nameText.setText(ci.getFirstName());
    contactViewHolder.feedDate.setText(ci.getDate());
    contactViewHolder.numberOfGoingText.setText(ci.getNumber_of_going());
    contactViewHolder.numberOfInterestedText.setText(ci.getNumber_of_interested());

    //seteaza fotografia de profil in postare
    new ProfilePictureDownloadImage(contactViewHolder.profilePicture).execute(ci.getProfileImageURL());

    ImageButton interestedButton = contactViewHolder.interestedButton;
    interestedButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = i;
            FeedInfo fi = feedInfoList.get(position);
            int displayedNumberOfInterested = Integer.parseInt(ci.getNumber_of_interested()) + 1;
            contactViewHolder.numberOfInterestedText.setText(Integer.toString(displayedNumberOfInterested));
            System.out.println("emilutzy interested from within" + fi.getPostID());
            contactViewHolder.surNameText.setText("kk");
        }
    });
}

问题是点击监听器。理论上,我按下的按钮应该增加它旁边的数字。但是,由于我必须将onBindViewHolder的参数声明为final,只有第一次点击有效,其余的点击不会更改数字的值。我是Android新手,您能帮我找一个更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

我不确定对象FeedInfo的外观如何,但你也可以使用一个名为increaseNumberOfInterested()的方法,它会将Number_of_interested的值增加一,并且会在recyclerview回收单元格时,该对象会持续存在。它有点像下面

 @Override
public void onBindViewHolder(final FeedViewHolder contactViewHolder, final int i) {

final FeedInfo ci = feedInfoList.get(i);

//Set the text of the feed with your data
contactViewHolder.numberOfInterestedText.setText(ci.getNumber_of_interested());


contactViewHolder.interestedButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        //Increase the number of interested in the object, so it can be persisted when cell is reclycled
        ci.setNumberOfInterested(ci.getNumber_of_interested()) + 1);

        //Get new value and display 
  contactViewHolder.numberOfInterestedText.setText(Integer.toString(ci.getNumber_of_interested()));
}

答案 1 :(得分:0)

有一个名为getAdapterPosition()的好方法,您可以在RecyclerView的{​​{1}}中使用。

不是在ViewHolder中设置点击监听器,而是在onBindViewHolder的构造函数中设置它,如下所示:

ViewHolder

请勿将您的位置设置为public class FeedViewHolder extends RecyclerView.ViewHolder { private TextView feedText; private TextView surNameText; private Button interestedButton; // ... the rest of your viewholder elements public FeedViewHolder(View itemView) { super(itemView); feedtext = itemView.findViewById(R.id.feedtext); // ... find your other views interestedButton.setOnClickListener(new View.OnClickListener() { final FeedInfo fi = feedInfoList.get(getAdapterPosition()); int numInterested = Integer.parseInt(ci.getNumber_of_interested()) + 1; // setting the views here might work, // but you will find that they reset themselves // after you scroll up and down (views get recycled). // find a way to update feedInfoList, // I like to use EventBus to send an event to the // host activity/fragment like so: EventBus.getDefault().post( new UpdateFeedInfoListEvent(getAdapterPosition(), numInterested)); // in your host activity/fragment, // update the list and call // notifyDatasetChanged/notifyDataUpdated() //on this RecyclerView adapter accordingly }); } } 至最终版(Android Studio会警告您原因)。