2012-03-11 144 views
2

我有一個應用程序,從數據庫加載圖像到一個滾動視圖。我想將其更改爲ListView。卡住自定義Android列表視圖

這是我現在有:

在ListView的每一行應該從這個XML文件被誇大:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_height="wrap_content" 
       android:layout_width="fill_parent" 
       android:orientation="horizontal" 
       android:layout_weight="1" 
       android:background="#FFFFFF"> 

       <ImageButton 
        android:background="@drawable/roundcorners" 
        android:id="@+id/figura" 
        android:src="@drawable/rice" 
        android:scaleType="centerInside" 
        android:cropToPadding="false" 
        android:paddingLeft="5dp" 
        android:paddingRight="5dp" 
        android:paddingBottom="10dip" 
        android:layout_height="84dip" 
        android:layout_width="98dip" 
        android:gravity="left"> 
       </ImageButton> 
       <LinearLayout 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:orientation="vertical" 
        android:gravity="left" 
        android:layout_weight="1"> 
        <TextView 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_alignParentTop="true" 
         android:text="Rice" 
         android:id="@+id/txtNome" 
         android:gravity="center" 
         android:textColor="#000000" 
         android:textSize="30dip" 
         android:textStyle="bold"/> 

        <TextView 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_alignParentTop="true" 
         android:text="rice, food" 
         android:id="@+id/txtTags" 
         android:gravity="left" 
         android:textColor="#000000" 
         android:textSize="20dip" 
         android:textStyle="bold"/> 
       </LinearLayout> 
     </LinearLayout> 

這基本上是一個圖像,它的名字和它的標籤。

我剛剛更新下面的代碼,以反映SLUKIAN的建議:

public class AnotherCursorAdapter extends SimpleCursorAdapter { 
    private LayoutInflater inflater; 
    public AnotherCursorAdapter(Context context, 
           int layout, 
           Cursor c, 
           String[] from, 
           int[] to) { 
     super(context, layout, c, from, to); 
     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
      // get the views from the row 
      TextView name = (TextView) view.findViewById(R.id.txtNome); 
      TextView tags = (TextView) view.findViewById(R.id.txtTags); 
      ImageView img = (ImageView) view.findViewById(R.id.figura); 
      //asign the values 
      name.setText(cursor.getString(4)); // the number will be the index of the column containing the name 
      tags.setText(cursor.getString(3)); // the same thing 
      // set the image resource, i don't know how you stored it in the database 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = inflater.inflate(R.layout.imgsinternas, null); 
     return v; 
    } 
} 

讓我在活動光標(從數據庫)在我的信息後,我這樣做:

    AnotherCursorAdapter adapter = new AnotherCursorAdapter(CadItemActivity.this, 
                      R.layout.imgsinternas, 
                      cursorImagens, 
                      new String[] {cursorImagens.getString(4), cursorImagens.getString(3)/*your columns from the cursor*/}, 
                      new int[] { R.id.txtNome, R.id.txtTags }); 
        telaScroll.setAdapter(adapter); 

當我運行建議的代碼時,出現以下錯誤:

java.lang.IllegalArgumentException:列'id'不存在

Slukian,我做錯了什麼?你能幫我嗎?

我真的很難用上面的代碼使用ListView。我有點失落。

如何將我的光標(cursorImagens)設置爲ListView的適配器?

如何設置圖像,名稱和標籤(這些是來自我的數據庫的三個信息)?

嘿傢伙......我見過很多教程,但其中大多數都是簡單的類,只是一個簡單的列表。

任何人都可以幫助我嗎?

任何幫助被讚賞!

+0

看到這個[鏈接](http://mobile.dzone.com/news/listview-data-sqlitedatabase)希望充分,這將幫助你 – Deepak 2012-03-11 17:42:50

回答

1

您應該從CursorAdapterSimpleCursorAdapter繼承並重寫getView(或newView和bindView)方法。 這裏有一個列表視圖和適配器一個很好的教程 - http://www.vogella.de/articles/AndroidListView/article.html

你也應該看羅曼蓋伊的(ListView的作者)的講話在谷歌IO稱爲The world of ListView

+0

弗拉基米爾你好,感謝你回答。任何示例代碼?我是一個小白菜! =/ – 2012-03-11 17:54:50

1

你必須實現自己的適配器,可以延長SimpleCursorAdapter,因爲你有數據光標:

public class AnotherCursorAdapter extends SimpleCursorAdapter { 

    private LayoutInflater inflater; 

    public AnotherCursorAdapter(Context context, int layout, Cursor c, 
      String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
      // get the views from the row 
      TextView name = (TextView) view.findViewById(R.id.txtNome); 
      TextView tags = (TextView) view.findViewById(R.id.txtTags); 
      ImageView img = (ImageView) view.findViewById(R.id.figura); 
      //asign the values 
      name.setText(cursor.getString(0)); // the number will be the index of the column containing the name 
      tags.setText(cursor.getString(1)); // the same thing 
      // set the image resource, i don't know how you stored it in the database 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = inflater.inflate(R.layout.the_layout_you_have, null); 
     return v; 
    } 
} 

然後在你的活動後,您將獲取數據使用該適配器爲您的列表:

AnotherCursorAdapter adapter = new AnotherCursorAdapter(this, 
       R.layout.test_row, cursor, new String[] {/*your columns from the cursor*/}, 
       new int[] { R.id.txtNome, R.id.txtTags }); 
listView.setAdapter(adapter); 
+0

你好Slukian,你的代碼似乎非常接近我所需要的。非常感謝你。但是,現在,當我運行它時,出現另一個錯誤:java.lang.IllegalArgumentException:列'id'不存在。我用你的建議更新了上面的代碼。你能幫我說我做錯了什麼嗎?非常感謝你! = ^) – 2012-03-12 01:29:10

+0

@CarlosPereira基於'Cursor'的適配器需要在數據庫中有一個特殊的列,像這樣'_id INTEGER PRIMARY KEY AUTOINCREMENT'。當你查詢數據庫時,除了你需要的其他列以外,把這個列添加到查詢中(儘管你不需要它必須存在的數據或者你得到了這個異常)。同樣,當你創建適配器時,第四個參數應該是一個包含數據庫中列名稱的字符串數組(現在你從光標而不是列名獲得字符串) – Luksprog 2012-03-12 07:49:07