2017-06-16 48 views
1

我有一个基于RealmRecyclerViewAdapter的recyclerviewAdapter。RecyclerView在滚动后选择错误的项目onClick

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); 
} 

}

的问题是,当我滚动回收视图,使顶部的人是不可见的,并且我点击视图,它上面的观点得到加粗字体。只有当我第二次点击它时,我的正确视图才会变成粗体字体。

+2

我想你忘了在适配器中覆盖这些方法: public long getItemId(int position){ return position; } public int getItemViewType(int position){ return position; } –

+0

工作就像一个魅力,谢谢。我不知道为什么这些方法必须被覆盖 – Traabefi

+0

前段时间我面临同样的问题,我浪费了2小时来找到 –

回答

1

我想你忘了适配器来覆盖这些方法:

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

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

我不知道为什么发生这种情况,但它是Recyclerview搞乱问题,当滚动正确的解决方案。

+0

这使得RecyclerView可以创建与项目一样多的视图。 – EpicPandaForce

+0

是的。多视图类型和使用getItemViewType创建的分页 –

相关问题