2010-08-26 29 views
4

我有一個具有多個列表視圖的活動,它們持續接收來自套接字線程的新值,另一個線程解析數據並更新數組適配器,然後ui線程調用notifyDataSetChanged()要刷新的列表。Android ListView ArrayAdapter數據更新最佳實踐

我的問題是,即時刷新所有列表幾秒鐘一次,這導致了UI時,需要發生一些動畫非常laggy。

我想知道什麼是最好的方法是每秒更新多個值更改多個列表?

謝謝, 圖騰。

回答

3

您應該使用遊標(如果需要內容提供商)和ListActivity。 UI一旦發生變化就會自動更新,如果數據集爲空,列表會自動顯示相關視圖。

下面的例子來解決它使用內容提供商:

的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!" /> 

通知了android:列表和android:空標籤。這些是列表活動所必需的。

在onCreate()方法:

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

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

您可以使用SimpleCursorAdapter如果你的意見是直截了當的。我由自己的適配器創建,因爲複雜的意見:

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

是的,該視頻是非常有幫助的。其中最大的取外賣的是,你應該回收convertView傳遞到您的列表適配器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; 
    } 

的其他有用的一點是使用一個ViewHolder類視圖循環。它在~10:30進入視頻。