RecyclerView - 更改所选项目图标需要两次点击才能工作

时间:2017-11-19 14:39:24

标签: java android android-recyclerview android-adapter android-viewholder

我正在开发一个邮件应用,用户可以将相同的邮件发送给多个联系人。当我打开联系人列表时,我希望能够点击该用户,并且他的个人资料图片应该被选中的图标替换。

当我点击选择某个用户时,图标 会闪烁,并且在我第一次点击它时不会改变 第二次点击它时图像仍然闪烁,但随后更改为已检查 ,每次下次点击该用户时,它都会闪烁但是按照我的意愿行事 - 成为选中/未选中状态。

我使用this教程作为指导,但没有记录它应该是好的。一些方法用一个单词解释,其他方法甚至没有提到,但出现在代码中。我寻找其他教程,并且真的找到了很多相同的(identical)示例,但没有比原版更深入。

Adapter.java

@Override
public void onBindViewHolder(final ChooseContactsAdapter.ChooseContactsViewHolder holder, final int position) {
    final Contact contact = contactList.get(position);

    holder.userName.setText(contact.getUserName());

    TextDrawable.IBuilder builder = TextDrawable.builder()
            .beginConfig()
            .withBorder(0)
            .toUpperCase()
            .endConfig()
            .round();

    ColorGenerator generator = ColorGenerator.MATERIAL;
//       generate color based on a key (same key returns the same color), useful for list/grid views
    int color = generator.getColor(contact.getUserId());
    textDrawable = builder.build(contactList.get(position).getUserName().substring(0, 1), color);
    holder.thumbNail.setImageDrawable(textDrawable);
    holder.contactId = contact.getUserId();
    // display profile image
    applyProfilePicture(holder, contact);

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // toggle selection
            toggleSelection(position);

            // Change background color of the selected items in list view
            holder.itemView.setBackgroundColor(selectedItems.get(position) ? 0x9934B5E4 : Color.TRANSPARENT);

            // check if item still exists
            if (position != RecyclerView.NO_POSITION) {
                Contact contact = contactList.get(position);
                Toast.makeText(v.getContext(), "You clicked " + contact.getUserName(), Toast.LENGTH_SHORT).show();

            }
            // handle icon animation
            applyIconAnimation(holder, position);
        }
    });
}

    private void applyProfilePicture(ChooseContactsViewHolder holder, Contact contact) {
    Picasso.with(context)
            .load(AppConfig.URL_PROFILE_PHOTO + contact.getThumbnailUrl())
            .placeholder(textDrawable)
            .error(textDrawable)
            .transform(new CircleTransform())
            .into(holder.thumbNail);
}

private void applyIconAnimation(ChooseContactsViewHolder holder, int position) {
    if (selectedItems.get(position, false)) {
        holder.iconFront.setVisibility(View.GONE);
        resetIconYAxis(holder.iconBack);
        holder.iconBack.setVisibility(View.VISIBLE);
        holder.iconBack.setAlpha(1);
        if (currentSelectedIndex == position) {
            FlipAnimator.flipView(context, holder.iconBack, holder.iconFront, true);
            resetCurrentIndex();
        }
    } else {
        holder.iconBack.setVisibility(View.GONE);
        resetIconYAxis(holder.iconFront);
        holder.iconFront.setVisibility(View.VISIBLE);
        holder.iconFront.setAlpha(1);
        if ((reverseAllAnimations && animationItemsIndex.get(position, false)) || currentSelectedIndex == position) {
            FlipAnimator.flipView(context, holder.iconBack, holder.iconFront, false);
            resetCurrentIndex();
        }
    }
}

private void toggleSelection(int pos) {
    currentSelectedIndex = pos;
    if (selectedItems.get(pos, false)) {
        selectedItems.delete(pos);
        animationItemsIndex.delete(pos);
    } else {
        selectedItems.put(pos, true);
        animationItemsIndex.put(pos, true);
    }
    notifyItemChanged(pos);
}

1 个答案:

答案 0 :(得分:3)

无需在notifyItemChanged方法上调用toggleSelection。您可以使用动画手动更改项目。

调用notifyItemChanged是导致闪烁的原因,因为它会干扰动画。