2017-06-16 3 views
1

Ich habe eine RecyclerviewAdapter basierend auf RealmRecyclerViewAdapter.RecyclerView Auswahl falscher Artikel onClick nach dem Scrollen

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

}

das Problem ist, dass, wenn ich die Recycler Ansicht bewegen, so dass die größten Aktionäre sind nicht sichtbar, und ich die Ansicht klicken, wird die Ansicht über den Fettschrift bekommt. Und nur wenn ich das zweite Mal klicke, wird die richtige Ansicht fett gedruckt.

+2

Ich glaube, Sie haben vergessen, diese Methode in Adapter zu überschreiben: öffentliche lange getItemId (int-Position) { Rückkehrposition; } public int getItemViewType (int-Position) { Rücksprungposition; } –

+0

Arbeitete wie ein Charme, danke. Ich frage mich, warum diese Methoden überschrieben werden müssen – Traabefi

+0

Ich konfrontiert dasselbe Problem vor einiger Zeit und ich verschwendete 2 Stunden, um das zu finden –

Antwort

1

Ich glaube, Sie diese Methode in Adapter außer Kraft zu setzen vergessen:

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

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

Ich bin nicht sicher, warum dies passieren, aber es ist richtige Lösung für Recyclerview Messing Problem, wenn scrollt.

+0

Das macht die RecyclerView so viele Viewholders erstellen, wie es Elemente gibt. – EpicPandaForce

+0

ja. Mehrfachansichtsart und Seitenumbruch, die mit getItemViewType erstellt wurden –

Verwandte Themen