2011-04-20 78 views
3

我有一個使用CursorAdapter以表格格式繪製數據集的ListActivity。我最初使用TableLayout(並繪製了整個表格),但是我擔心這會佔用太多的內存(並且繪製頁面很慢),所以我現在正在使用CursorAdapter進行調查。CursorAdapter慢/滾動

爲活動主體的XML佈局看起來像這樣(請注意使用Horizo​​ntalScrollView,這可能是一個原因):

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:id="@+id/layout_query_viewer"> 

    <TextView 
     android:id="@+id/query_table_name" 
     style="@style/ActivityTitle" /> 

    <HorizontalScrollView 
     android:id="@+id/hsvMainContent" 
     android:scrollbars="none" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

     <LinearLayout 
      android:id="@+id/llMainContent" 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 

      <LinearLayout 
       android:id="@+id/fixed_headers" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" /> 

      <ListView 
       android:id="@android:id/android:list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"/> 
     </LinearLayout> 
    </HorizontalScrollView> 
</LinearLayout> 

CursorAdapter的是這樣的:

private class QueryAdapter extends CursorAdapter { 
    public QueryAdapter(Context context) { 
     super(context, null); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     /* 
     * I'm deliberately not inflating here as I'm synchronizing a remote 
     * database, so I don't know how many columns my query will return. 
     */ 
     LinearLayout layout = new LinearLayout(context); 
     ViewHolder holder = new ViewHolder(cursor.getColumnCount()); 
     layout.setTag(holder); 

     for (int i = 1; i < cursor.getColumnCount(); i++) { 
      TextView cell = new TextView(context); 

      holder.cells[i] = cell; 

      cell.setBackgroundColor(Color.WHITE); 
      cell.setMinimumWidth(mColumnWidths[i]); 
      cell.setPadding(1, 1, 1, 1); 

      layout.addView(cell); 
     } 

     return layout; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ViewHolder holder = (ViewHolder)view.getTag(); 

     for (int i = 1; i < cursor.getColumnCount(); i++) { 
      holder.cells[i].setText(cursor.getString(i)); 
     } 
    } 
} 

static class ViewHolder { 
    TextView[] cells; 

    public ViewHolder(int size) { 
     cells = new TextView[size]; 
    } 
} 

當我畫完整個桌子時,我很滿意滾動性能,但現在我切換到了CursorAdapter,滾動是生澀的(我的意思是不可接受的生澀)。 CursorAdapter方法在邏輯上看來在架構上是正確的決定,但除非我能解決滾動問題,否則我將不得不返回繪製整個表格。

有沒有其他人經歷過這個問題,或者可以闡明我做錯了什麼?

回答

1

我從Android Market下載了「SQLite編輯器」(由Speed Software提供),並注意到他們的表格渲染非常光滑。我聯繫了開發人員,他們非常友好,指引我朝着正確的方向前進。

我實際上已經結束了使用畫布和在自定義視圖中繪製表格。它不會比實施CursorAdapter解決方案花費更多的時間。

+1

我們爲Android TweetDeck做了同樣的事情。 Android的標準ListView組件是一大堆垃圾。 – mxcl 2012-02-21 16:10:16

+1

你可以分享一些關於你做什麼的高層次細節嗎?謝謝! – ahmedre 2012-05-24 20:24:31

+0

我很好奇聽到關於這個的索姆指針。有完全相同的問題。 – jannej 2013-04-10 13:27:35