2017-11-08 4 views
0

Ich habe ein Problem, das nur auf Android 5.1.1 und wenigen Geräten auf 5.1 Reprodieren. Auf den Rest der Versionen funktioniert gut.RecyclerView nicht Benutzeroberfläche auf Android 5.1.1 aktualisieren

Recycler-Ansicht onClick-Listener haben, wo ich versuche, die Sichtweite von GONE zu VISIBLE oder umgekehrt zu aktualisieren. Nach dem Klicken auf den Eintrag ändert sich nichts auf der Benutzeroberfläche. Hinweis: Wenn ich das Fragment (BackButton) schließe und erneut öffne, wird die Benutzeroberfläche aktualisiert. Auch nach dem Drücken der Zurück-Taste sehe ich, dass die Benutzeroberfläche für einige Millisekunden aktualisiert wird, bevor sie gelöscht wird.

Ich habe versucht, alle Adapter, aktuellen Artikel zu benachrichtigen, itemView, swap() ungültig und Adapter ohne Erfolg erneut zu setzen. Alle Methoden setVisibility(), onClick, Callbacks, BindView werden erfolgreich aufgerufen (Debugger).

public class PhotoGalleryAdapter extends RecyclerView.Adapter<PhotoGalleryAdapter.PhotoHolder> { 

    private Context context; 
    private List<String> photos; 
    private View.OnClickListener listener; 

    public PhotoGalleryAdapter(Context context, List<String> photos, View.OnClickListener listener) { 
     this.context = context; 
     this.photos = photos; 
     this.listener = listener; 
    } 

    @Override 
    public PhotoGalleryAdapter.PhotoHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_photo, parent, false); 
     return new PhotoHolder(v, listener); 
    } 

    @Override 
    public void onBindViewHolder(final PhotoGalleryAdapter.PhotoHolder holder, int position) { 
     String photoPath = photos.get(position); 
     Glide.with(context) 
       .load(photoPath) 
       .thumbnail(0.1f) 
       .into(holder.image); 

     if (Utils.getSelectedPhotos().contains(photoPath)) { 
      DrawableCompat.setTint(holder.selection.getDrawable(), ContextCompat.getColor(context, R.color.white)); 
      holder.selection.setVisibility(View.VISIBLE); 
     } else { 
      holder.selection.setVisibility(View.GONE); 
     } 
    } 

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

    public void updateDataSet(List<String> photos) { 
     if (!photos.equals(this.photos)) { 
      this.photos.clear(); 
      this.photos.addAll(photos); 
      notifyDataSetChanged(); 
     } 
    } 

    class PhotoHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     @BindView(R.id.imageView) AppCompatImageView image; 
     @BindView(R.id.selectionState) AppCompatImageView selection; 

     private View.OnClickListener listener; 

     PhotoHolder(View view, View.OnClickListener listener) { 
      super(view); 
      ButterKnife.bind(this, view); 
      view.setOnClickListener(this); 
      this.listener = listener; 
     } 

     @Override 
     public void onClick(View view) { 
      if (Utils.getSelectedPhotos().contains(photos.get(getAdapterPosition()))) { 
       selection.setVisibility(View.GONE); 
       Utils.getSelectedPhotos().remove(photos.get(getAdapterPosition())); 
      } else { 
       Utils.getSelectedPhotos().add(photos.get(getAdapterPosition())); 
       DrawableCompat.setTint(selection.getDrawable(), ContextCompat.getColor(context, R.color.white)); 
       selection.setVisibility(View.VISIBLE); 
      } 
      listener.onClick(view); 
     } 
    } 
} 

Und auf Rückruf:

@Override public void onClick(View view) { 
    callbacks.onPhotoSelected(Utils.getSelectedPhotos().size()); 
    adapter.notifyDataSetChanged(); } 
+0

Sind Ihre Support-Bibliotheken auf dem neuesten Stand? –

+0

@TylerPfaff ja, supportVersion = '27 .0.0 ' –

Antwort

0

Ihre PhotoGalleryAdapter Laut.

public void updateDataSet(List<String> photos) { 
    if (!photos.equals(this.photos)) { 
     this.photos.clear(); 
     this.photos.addAll(photos); 
     notifyDataSetChanged(); 
    } 
} 

Und Sie verwenden

if (Utils.getSelectedPhotos().contains(photoPath)) { 
     DrawableCompat.setTint(holder.selection.getDrawable(), ContextCompat.getColor(context, R.color.white)); 
     holder.selection.setVisibility(View.VISIBLE); 
} else { 
     holder.selection.setVisibility(View.GONE); 
} 

Diese Linie Utils.getSelectedPhotos() nicht aktualisieren.

Und Ihr Problem ist callbacks.onPhotoSelected(Utils.getSelectedPhotos().size());.

Sie können updateDataSet verwenden, um die Benutzeroberfläche zu aktualisieren.

Wenn Sie klicken. Und Sie können so verwenden.

Utils.setSelectedPhotos(yourList); 
adapter.updateDataSet(yourList); 

bearbeiten

Sie Ihre Liste zuerst aktualisieren sollte, dann notifyDataSetChanged verwenden.

So Sie Liste nicht aktualisiert, sollten Sie nachsehen.

+0

Funktioniert nicht. notifyDataSetChanged() funktioniert ok, aber UI (setVisibilty) funktioniert immer noch nicht. –

+0

Sie sollten Ihren eigenen Code überprüfen. 'Callbacks.onPhotoSelected (Utils.getSelectedPhotos(). Size());' – KeLiuyue

+0

Dieser Code nur synchronisierte Liste zurück . Ich habe versucht, lokale (nicht statische) mit den gleichen Ergebnissen zu verwenden. –

0

Update-Lösung: nach onClick Wechsel:

 @Override 
      public void onClick(View view) { 
       if (Utils.getSelectedPhotos().contains(photos.get(getAdapterPosition()))) { 
        Utils.getSelectedPhotos().remove(photos.get(getAdapterPosition())); 
       } else { 
        Utils.getSelectedPhotos().add(photos.get(getAdapterPosition())); 
       } 
       notifyDataSetChanged(); 
       listener.onClick(view); 
      } 

funktioniert gut, ABER nur mit LinearLayoutManager. Funktioniert immer noch nicht mit GridLayoutManager. Also nach dem Aufruf von setVisibility() zweimal funktioniert Android unvorhersehbar.

Verwandte Themen