2016-04-11 3 views
2

Ich habe eine RecyclerView in der Elemente sind LinearLayout mit mehreren TextViews als Kinder. Abhängig von einigen Regeln (dies wird in onBindViewHolder entschieden), kann die TextViews versteckt (Sichtbarkeit GONE) oder angezeigt werden.RecyclerView mit Elementen, die ihre Kinder verstecken/anzeigen

Mein Problem ist, dass, wenn ich zum Beispiel habe 3 Punkte (A, B und C) in den RecyclerView mit der gleichen Anzahl von sichtbaren TextViews und A oben auf der Liste steht, B in der Mitte und C an der Unterseite Wenn B zum Beispiel mehr TextViews als zuvor zeigen muss, überlappt sich dieser Punkt (B) während eines kurzen Zeitraums mit C, da er größer geworden ist und die neuen sichtbaren TextViews aufnehmen muss, die zuvor mit Sichtbarkeit GELÖSCHT waren.

Visuelle Darstellung des Problems:

Gewünschte Situation

enter image description here

Aktuelle und unerwünschte Situation

enter image description here

Nach ein wenig passt die RecyclerView das Element korrekt.

Wie kann ich dies vermeiden?

EDIT:

In einer der Kommentare vorgeschlagen, dass ich vielleicht animieren und transformiert die Ansichten selbst. Ist das notwendig oder gibt es einen anderen Weg? Wenn ja, wie kann ich die Ansichten animieren und transformieren?

EDIT 2:

Versuchte diese Antwort: Animating items, aber die Probleme weiterhin bestehen. Es gibt eine sichtbare Verzögerung bis die RecyclerView Updates.

EDIT 3:

ich diese Klasse bin mit (RecyclerViewCursorAdapter) als Basis für den Adapter, der die RecyclerView auffüllt. Aditionally, ich bin dies, dass in onResume ist

@Override 
public void onResume() 
{ 
    super.onResume(); 

    if(getActivity().getSupportLoaderManager().getLoader(R.id.myLoaderId) == null) 
    { 
     getActivity().getSupportLoaderManager().initLoader(R.id.myLoaderId, null, this); 
    } 
    else 
    { 
     getActivity().getSupportLoaderManager().restartLoader(R.id.myLoaderId, null, this); 
    } 
} 
+0

Versuchen Sie, 'TextViews'' INVISIBLE' anstelle von 'GONE' zu erstellen. – sonictt1

+0

Können Sie Ihren Code veröffentlichen, der anzeigt, was vor sich geht? Wenn sich die Daten ändern, sollten Sie einfach recyclerView.getAdapter() aufrufen können. NotifyDataSetChanged(); und es sollte die recyclerView korrekt neu zeichnen. – LNI

+0

@ LNI Ich mache das, aber wie gesagt, das Problem entsteht während einer kurzen Zeitspanne (ich denke, während die "RecyclerView" Updates), dann wird es richtig gerendert. – OneEyeQuestion

Antwort

0

Ihr Problem zu tun: in Ihre xml (Artikel Ansicht), erklären Sie Textview mit Standardattribut:

android:visibility="gone" 

wenn Prüfbedingung:

if (condition) { 
    textView.setVisibility(View.VISIBLE); 
} 

Stattdessen sollten Sie Folgendes tun:

if (condition) { 
    textView.setVisibility(View.VISIBLE); 
} else { 
    textView.setVisibility(View.GONE); 
} 
+0

Ich mache, was Sie vorschlagen. Das Problem ist, dass, wenn die Sichtbarkeit auf "SICHTBAR" geändert wird, der "RecyclerView" für eine kurze Zeit den Artikel mit neuer Höhe anzeigt, aber den Artikel darunter überlappt. – OneEyeQuestion

+0

Können Sie Ihren Code anzeigen? –

+0

Mein Code ist genau wie bei Ihnen, wenn Sie die Datenbindung und all das Zeug entfernen – OneEyeQuestion

0

Wenn seine Höhe 0 wird, wird es nicht sichtbar sein :). Ich nehme an, dass Ihr Root-Layout eine minimale Höhe (oder exakte Höhe) hat, die es immer noch Platz braucht, obwohl es GONE ist.

0

Wenn Sie auch weichen Animationseffekt hinzufügen müssen, versuchen Sie diesen.

Standardmäßig setzen Sichtbarkeit == gegangen.

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
{ 
    super.onBindViewHolder(holder, position); 

    holderG.layoutReply.setVisibility(View.GONE); 
} 

Und setzen Sichtbarkeit etwas wie:

holder.button.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View view) 
       { 
         if (holderG.layoutReply.getVisibility() == View.VISIBLE) {     
          notifyItemChanged(holderG.getAdapterPosition()); 
         } 
         else {holderG.layoutReply.setVisibility(View.VISIBLE); 
         } 
        } 
       } 
      }); 

und in Ihrem Inflator Layout gesetzt

android:animateLayoutChanges="true" 

für Eltern-Layout.

Hinweis-- im Falle der Sichtbarkeit == SICHTBAR, animiert Layoutänderungen funktioniert gut und glatt, aber im Falle der Sichtbarkeit == GONE Elemente überlappen einander, deshalb benutze ich notifyItemChanged, um die Sichtbarkeit der Ansicht zurück zu ändern.