2015-02-11 10 views
7

Ich vor kurzem ein Problem festgestellt, wo die Animation eines unbestimmten ProgressBar innerhalb einer ListView Reihe abgehackt wurde. Kurz gesagt, ich habe eine ListView, wobei jede Zeile eine ProgressBar enthält. Die Animationen sehen gut aus, bis ich blättern kann; Von nun an wird mindestens einer der ProgressBar eine abgehackte Animation haben.Choppy ProgressBar Leistung bei Verwendung in ListView

Kann jemand dieses Problem beheben?

http://imgur.com/EMoRGnJ

Ansicht für das Listview-Reihe

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ProgressBar 
     android:indeterminate="true" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

Einfache individuelle ArrayAdapter

public class MyAdapter extends ArrayAdapter { 

    List list; 

    public MyAdapter(Context context, List objects) { 
     super(context, 0, objects); 
     list = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null) { 
      convertView = ((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.list_row, parent, false); 
     } 

     return convertView; 
    } 
} 

OnCreate() Methode für die Probenaktivität

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 

     ListView listView = (ListView)findViewById(R.id.list_view); 
     ArrayList<Integer> data = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16,17)); 
     MyAdapter adapter = new MyAdapter(this, data); 

     listView.setAdapter(adapter); 
    } 

Fehler protokolliert (enthält Beispielprojekt): https://code.google.com/p/android/issues/detail?id=145569&thanks=145569&ts=1423673226

Antwort

0

Versuchen Sie, die view holder pattern zu implementieren und überprüfen Sie die Leistung.

Erstellen Sie eine statische ViewHolder-Klasse mit einer Fortschrittsanzeige.

static class ViewHolder { 
    ProgressBar progress; 
} 

und in Ihrem getView() Sie den Blick Halter aus der Sicht erhalten finden nur, wenn die convertView Null ist, andernfalls nehmen Sie es von dem Tag der viewHolder halten. Auf diese Weise blähen Sie nur dann eine neue Ansicht auf, wenn convertView Null ist, andernfalls verwenden Sie die Ansichten, die in Ihrem Tag viewholder gespeichert sind. Ein einfaches Tutorial finden Sie here.

+3

In diesem Fall Konstruktor verwenden, ich glaube nicht, die Ansicht Halter Muster helfen. In der Regel wird das Ansichtshalter-Muster verwendet, um die Anzahl von "findViewById" -Aufrufen zu reduzieren, was sich negativ auf die Leistung auswirken kann (im Allgemeinen für die Scroll-Leistung von Listen). In diesem Beispiel rufe ich 'findViewById' nie auf, daher scheint das Verwenden des Ansichtshaltermusters das Problem nicht zu beheben. –

+1

@Eric Farraro du hast Recht. Aber ich bin gespannt, ob sich das RecyclerView gleich verhält. Hast du es mit einem LinearLayoutManager getestet? – cybergen

+1

@cybergen, nach Ihrem Vorschlag habe ich einen einfachen RecyclerView/LinearLayoutManager ausprobiert. Es scheint viel besser zu funktionieren, und ich habe den gleichen Fehler in der Animation nicht beobachtet. Scheint so, als ob der Fehler speziell bei der ListView/ProgressBar Animation sein könnte. –

0

es passiert zum ersten Mal nur, wenn Sie die App schließen und erneut öffnen, werden Sie es nicht bemerken.

Haben Sie ältere Versionen wie kitkat eingecheckt?

Und nicht LayoutInflater im getView(), erstellen Sie einmal im Konstruktor erstellen und es in dem