2015-02-11 16 views
7

Recentemente ho riscontrato un problema in cui l'animazione di un numero indeterminato ProgressBar utilizzato all'interno di una riga ListView è diventato instabile. In poche parole, ho un ListView in cui ogni riga contiene un ProgressBar. Le animazioni sembrano grandi, finché non scorrono; da quel momento, almeno uno degli ProgressBar avrà un'animazione aleatoria.Choppy ProgressBar prestazioni quando utilizzato in ListView

Qualcuno sa come risolvere questo problema?

http://imgur.com/EMoRGnJ

View per la riga ListView

<?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> 

Semplice personalizzato 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() metodo per il campione Activity

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

Bug registrato (contiene progetto di esempio): https://code.google.com/p/android/issues/detail?id=145569&thanks=145569&ts=1423673226

risposta

0

Provare a implementare lo view holder pattern e controllare le prestazioni.

Creare una classe ViewHolder statica con una barra di avanzamento.

static class ViewHolder { 
    ProgressBar progress; 
} 

e nel vostro getView() si ottiene trovare il supporto vista dal punto di vista solo quando la convertView è nullo, altrimenti prendi dal tag tenendo la viewHolder. In questo modo stai gonfiando una nuova vista solo quando lo convertView è nullo, altrimenti stai utilizzando le visualizzazioni memorizzate nel tuo tag viewholder. Un semplice tutorial può essere trovato here.

+3

In questo caso, non credo che il modello di vista titolare sarà di aiuto. In genere, il pattern del view view viene utilizzato per ridurre il numero di chiamate 'findViewById', che possono influire negativamente sulle prestazioni (in genere, per le prestazioni di scorrimento elenco). In questo esempio, non chiamo mai 'findViewById', quindi l'uso del pattern di visualizzazione non sembra che risolverà il problema. –

+1

@Eric Farraro hai ragione. Ma sono curioso di sapere se RecyclerView si comporta allo stesso modo. Lo hai provato con un LinearLayoutManager? – cybergen

+1

@cybergen, dopo il tuo suggerimento, ho provato anche un semplice RecyclerView/LinearLayoutManager. Sembra funzionare molto meglio e non ho osservato lo stesso problema nell'animazione. Sembra che il bug potrebbe essere specificamente con l'animazione ListView/ProgressBar. –

0

sta accadendo solo per la prima volta, se chiudi e riapri l'app, non te ne accorgi.

Hai controllato le versioni precedenti come kitkat?

E non creare LayoutInflater nel GetView(), creare una volta nel costruttore e utilizzarlo nel constuctor

Problemi correlati