Android RecyclerView在滚动后再次单击选择错误的项目

Android RecyclerView在滚动后再次单击选择错误的项目,android,android-recyclerview,realm,Android,Android Recyclerview,Realm,我有一个基于RealmRecyclServiceAdapter的RecycleServiceAdapter public class PlaceAdapter extends RealmRecyclerViewAdapter<Place, PlaceAdapter.PlaceViewHolder> implements Filterable { private static final String TAG = PlaceAdapter.class.getSimpleName();

我有一个基于RealmRecyclServiceAdapter的RecycleServiceAdapter

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);
}
公共类PlaceAdapter扩展RealmRecyclServiceAdapter实现可过滤{
私有静态最终字符串标记=PlaceAdapter.class.getSimpleName();
静态类PlaceViewHolder扩展了RecyclerView.ViewHolder{
文本视图名称;
PlaceViewHolder(视图项视图){
超级(项目视图);
name=(TextView)itemView.findViewById(R.id.name);
}
}
私人领域;
私有静态RecycleServiceClickListener itemListener;
私有文本视图lastTextView;
public PlaceAdapter(@NonNull上下文、@Nullable OrderedRealmCollection数据、布尔值自动更新、RecycleServiceClickListener侦听器、,
领域(领域){
超级(上下文、数据、自动更新);
this.realm=领域;
itemListener=监听器;
}
@凌驾
public PlaceViewHolder onCreateViewHolder(视图组视图组,int i){
View itemView=LayoutInflater.from(viewGroup.getContext())。
充气(R.layout.place\u item\u layout,viewGroup,false);
返回新的PlaceViewHolder(itemView);
}
@凌驾
BindViewHolder上的公共无效(最终位置ViewHolder,最终整型位置){
最终位置=getData().get(位置);
holder.name.setText(place.getName());
holder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图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;
}
});
}
@凌驾
public int getItemCount(){
返回getData().size();
}
@凌驾
公共过滤器getFilter(){
最终过滤器=新过滤器(){
@抑制警告(“未选中”)
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
字符串文本=constraint.toString();
如果(text==null | |“”.equals(text)){
updateData(realm.where(Place.class).findAll());
}否则{
updateData(realm.where(Place.class)
.contains(“名称”,文本,不区分大小写)//TODO:change字段
.findAll());
}
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=新的FilterResults();
返回结果;
}
};
回流过滤器;
}
公共接口RecycleServiceClickListener{
void recycleriveEWListClicked(int-placeId);
}
}


问题是,当我滚动“回收器”视图时,顶部的视图不可见,我单击该视图时,它上面的视图会显示粗体字体。只有当我第二次单击它时,正确的视图才会显示粗体。

我想你忘了在adapter中覆盖这些方法:

   @Override
    public long getItemId(int position) {
        return position;
    }

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

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

我认为您忘记在适配器中重写这些方法:public long getItemId(int position){return position;}public int getItemViewType(int position){return position;}工作得很好,非常感谢。我想知道为什么必须重写这些方法。我不久前遇到过同样的问题,我浪费了两个小时才发现这听起来不正确。这使得RecyclerView创建的视图持有人数量与项目数量一样多。这解决了我的问题,因此,我将该答案标记为已接受,这使得RecyclerView创建的视图持有人数量与项目数量一样多。是的。使用getItemViewType创建多视图类型和分页