【问题标题】:Single selected item on recyclerview androidrecyclerview android上的单个选定项目
【发布时间】:2016-04-19 15:50:37
【问题描述】:

当用户点击时,我试图在我的回收站视图中突出显示我的一个项目。但我有一个意想不到的行为。

当我单击一个项目时,适配器会记录我该项目已被选中并突出显示。但是当我滚动时,我看到还有其他突出显示的项目。

对于这个问题的任何帮助将不胜感激。

我的代码:

我的适配器

public class ChooseRecipientAdapter extends RecyclerView.Adapter<ChooseRecipientViewHolder> {


 @Override
public ChooseRecipientViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_recipients_item, null);
    ChooseRecipientViewHolder cv = new ChooseRecipientViewHolder(this.context, v);
    return cv;
}

 @Override
public void onBindViewHolder(final ChooseRecipientViewHolder holder, final int position) {
    RecipientItem settingsRecipients = recipientItems.get(position);
    settingsRecipients.holder = holder;

    holder.title.setText(settingsRecipients.title);

    holder.recipient = recipients.get(position);

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (selectedItem < 0) {
                selectedItem = position;
                holder.isSelected = true;
                holder.itemView.setSelected(true);
                holder.title.setTextColor(context.getResources().getColor(R.color.color_background));
            } else if (holder.isSelected) {
                selectedItem = -1;
                holder.isSelected = false;
                holder.itemView.setSelected(false);
                holder.title.setTextColor(context.getResources().getColor(R.color.textColorPrimary));
                ChooseRecipientActivity.recipient = null;

            } else {
                if (getItem(selectedItem).holder != null) {
                    getItem(selectedItem).holder.isSelected = false;
                    getItem(selectedItem).holder.itemView.setSelected(false);
                    getItem(selectedItem).holder.title.setTextColor(context.getResources().getColor(R.color.textColorPrimary));
                    selectedItem = position;
                    holder.isSelected = true;
                    holder.itemView.setSelected(true);
                    holder.title.setTextColor(context.getResources().getColor(R.color.color_background));
                    ChooseRecipientActivity.recipient = holder.recipient;

                } 
            }
        }
    });


}

我的 ViewHolder

public class ChooseRecipientViewHolder extends RecyclerView.ViewHolder {


public String id;
public Context context;
public ImageView leftImageView;
public TextView title;
public boolean isSelected = false;
public Recipient recipient;
public View itemView;


public ChooseRecipientViewHolder(final Context context, View view) {
    super(view);
    this.context = context;
    this.leftImageView = (ImageView) view.findViewById(R.id.leftIcon);
    this.title = (TextView) view.findViewById(R.id.title);
    itemView = view;

    }
}

截图:

Highligted issue

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    问题是,如果未选中该行,您需要重置 ViewHolder 选中状态。

    if(selected) {
        setRowColour();
    } else {
        resetColourToDefaults();
    }
    

    这非常重要,因为RecyclerView 将在您上下滚动时重复使用ViewHolder 行。重复使用的行将保留之前应用的格式。

    【讨论】:

    • 是的,这是我在适配器的 onClick() 方法的最后一个 else 中所做的。我重置旧的选择并突出显示新的。
    • 这对 onClick 方法没有帮助。它需要在onBindViewHolder 方法本身中。
    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多