2010-08-26 6 views
4

J'ai une activité avec plusieurs vues de liste qui reçoivent continuellement de nouvelles valeurs à partir d'un socket, un autre thread analyse les données et met à jour les adaptateurs de tableau, puis le thread ui appelle notifyDataSetChanged() la liste à rafraîchir.Android ListView Mises à jour des données ArrayAdapter Meilleures pratiques

Mon problème est que rafraîchir toute la liste quelques instants par seconde, cela rend l'interface utilisateur très laggy lorsque certaines animations doivent se produire.

Je me demandais quel est le meilleur moyen de mettre à jour plusieurs listes avec plusieurs changements de valeur chaque seconde?

Merci, Totem.

Répondre

3

Vous devez utiliser Curseurs (si nécessaire les fournisseurs de contenu) et ListActivity. L'interface utilisateur se met à jour automatiquement dès qu'il y a des modifications et dans le cas des ensembles de données nulles, la liste affiche automatiquement une vue pertinente.

exemples suivants permet de résoudre à l'aide de fournisseurs de contenu:

main.xml:

<ListView android:id="@id/android:list" android:layout_width="fill_parent" 
     android:layout_height="wrap_content"></ListView> 
    <TextView android:id="@id/android:empty" android:layout_width="fill_parent" 
     android:gravity="center" android:layout_height="wrap_content" 
     android:text="No data, please refresh!" /> 

Avis Android: liste et Android: balises vides. Ceux-ci sont requis par l'activité de liste.

Dans la méthode onCreate():

mCursor = getContentResolver().query(SOME_URI, 
       null, null, null, null); 

     ListView mListView = (ListView) findViewById(android.R.id.list); 
     mListView.setAdapter(new CustomCusorAdapter(getApplicationContext(), 
       mCursor)); 

Vous pouvez utiliser un SimpleCursorAdapter si vos vues sont simple. J'ai créé par propre adaptateur en raison des vues complexes:

private class CustomCusorAdapter extends CursorAdapter { 

     public CustomCusorAdapter(Context context, Cursor c) { 
      super(context, c); 
     } 

     @Override 
     public void bindView(View view, Context context, Cursor cursor) { 


      Holder holder = (Holder) view.getTag(); 

      holder.tv.setText(cursor.getString(cursor 
        .getColumnIndex(COL1_NAME))); 


     } 

     @Override 
     public View newView(Context context, Cursor cursor, ViewGroup parent) { 
      View v = getLayoutInflater().inflate(
        R.layout.layout_xml, null); 

      Holder holder = new Holder(); 

      holder.tv = (TextView) v 
        .findViewById(R.id.tv); 
      holder.cb= (CheckBox) v 
        .findViewById(R.id.cb); 

      v.setTag(holder); 
      return v; 
     } 

    } 

    private class Holder { 
     TextView tv; 
     CheckBox cb; 
    } 
2

Oui, cette vidéo est très utile. L'un des plus grands plats à emporter est que vous devez recycler le convertView passé dans votre liste adaptateurs méthode getView:

public View getView(int position, View convertView, ViewGroup parent){ 
     if (convertView == null) { 
      convertView = mInflator.inflate(resource, parent, false); 
     } 
     //do any view bindings for the row 
     return convertView; 
    } 

L'autre était peu utile d'utiliser une classe ViewHolder pour le recyclage de la vue. C'est à ~ 10:30 dans la vid.

Questions connexes