在滚动后,RecyclerView点击选择错误的项目

3

我有一个基于RealmRecyclerViewAdapter的RecyclerView适配器。

public class PlaceAdapter extends RealmRecyclerViewAdapter<Place, PlaceAdapter.PlaceViewHolder> implements Filterable {

private static final String TAG = PlaceAdapter.class.getSimpleName();

static class PlaceViewHolder extends RecyclerView.ViewHolder {

    TextView name;

    PlaceViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.name);
    }
}

private Realm realm;
private static RecyclerViewClickListener itemListener;
private TextView lastTextView;

public PlaceAdapter(@NonNull Context context, @Nullable OrderedRealmCollection data, boolean autoUpdate, RecyclerViewClickListener listener,
                    Realm realm) {
    super(context, data, autoUpdate);
    this.realm = realm;
    itemListener = listener;
}

@Override
public PlaceViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).
            inflate(R.layout.place_item_layout, viewGroup, false);
    return new PlaceViewHolder(itemView);
}

@Override
public void onBindViewHolder(final PlaceViewHolder holder, final int position) {
    final Place place = getData().get(position);
    holder.name.setText(place.getName());

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            itemListener.recyclerViewListClicked(place.getId());
            holder.name.setTypeface(Typeface.create(holder.name.getTypeface(), Typeface.BOLD), Typeface.BOLD);

            if (lastTextView != null && lastTextView != holder.name) {
                lastTextView.setTypeface(Typeface.create(lastTextView.getTypeface(), Typeface.NORMAL), Typeface.NORMAL);
            }
            notifyItemRangeChanged(0, getItemCount());

            lastTextView = holder.name;
        }
    });
}

@Override
public int getItemCount() {
    return getData().size();
}

@Override
public Filter getFilter() {
    final Filter filter = new Filter() {

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            String text = constraint.toString();
            if (text == null || "".equals(text)) {
                updateData(realm.where(Place.class).findAll());
            } else {
                updateData(realm.where(Place.class)
                        .contains("name", text, Case.INSENSITIVE) // TODO: change field
                        .findAll());
            }
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults();
            return results;
        }
    };

    return filter;
}

public interface RecyclerViewClickListener {

    void recyclerViewListClicked(int placeId);
}

问题在于,当我滚动Recycler View时,因此顶部的视图不可见,并且当我单击视图时,上面的视图会变成粗体字。只有当我第二次点击它时,才会正确地使选择的视图加粗。

3
我认为您忘记在适配器中覆盖这些方法: public long getItemId(int position) { return position; }public int getItemViewType(int position) { return position; } (提示:以上为已翻译内容) - Divyesh Patel
非常顺利,谢谢。我想知道为什么这些方法必须被覆盖。 - Lukas Anda
我之前也遇到过同样的问题,浪费了两个小时才找到解决方法。 - Divyesh Patel
那听起来不正确。这只会让RecyclerView创建与项目数量相同的视图持有者。 - EpicPandaForce
好的,它解决了我的问题,所以我将那个答案标记为已接受。 - Lukas Anda
1个回答

9
我认为您忘记在适配器中覆盖这些方法了:
   @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

我不确定为什么会发生这种情况,但在滚动时,这是解决RecyclerView混乱问题的正确方法。

这将使RecyclerView创建与项目数量相同的视图持有者。 - EpicPandaForce
是的。使用getItemViewType创建多个视图类型和分页。 - Divyesh Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接