ListView - 自定义适配器 - 数据库

时间:2013-03-16 07:38:42

标签: android android-listview custom-adapter

Android 2.3.3

我在数据库中有一个包含两列的表。我希望检索这些数据并在具有两个文本视图的ListView中显示它们(第一个textview中的第一列和第二个textview中的第二列),并对数据库中的所有行重复此操作。我已经阅读了一些关于(自定义适配器和列表视图)的例子,但是我读的越多,我就越感到困惑。

有人能给我一个如何做到这一点的先声夺人吗?我可以使用动态列表视图,但我希望使用静态列表视图。

以下是listview中行的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:paddingBottom="5dp"
    android:paddingTop="5dp" >

    <TextView
        android:id="@+id/txtView_History_Expression"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="0.50"
        android:text="Expression"
        android:textColor="#FFFFFF"
         />

    <TextView
        android:id="@+id/txtView_History_Result"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="0.50"
        android:text="Result"
        android:textColor="#316DA2" />

</LinearLayout>

以下是带有ListView的XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >


    <TextView 
        android:id="@+id/txtView_History_Header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="HISTORY"
        android:gravity="center"
        android:textSize="24dp"
        android:textColor="#316DA2"
        android:paddingTop="10dp"
        />

    <ListView
        android:id="@+id/lvHistory"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

我正在从数据库中检索数据并将其存储在Cursor中。我想从Cursor读取数据并将这些值提供给listview中的textviews。

3 个答案:

答案 0 :(得分:1)

你应该遵循这个流程

步骤1 - &gt;从数据库中获取数据并使用getter Setter填充List

步骤2 - &gt;创建BaseAdapter类并在此类中提供该列表[这里您需要查看BaseAdpter绑定方法]

Stap 3 - &gt;使用ListView绑定BaseAdapter对象

答案 1 :(得分:1)

  

我在数据库中有一个包含两列的表。我希望找回这个   数据并在具有两个文本视图的ListView中显示它们(第一列中的   第一个textview和第二个textview中的第二列)并重复此操作   直到数据库中的所有行。我看了几个例子   on(自定义适配器和listview)怎么做,但是我读的越多,   更多我感到困惑。

您好。这个算法并不太棘手。您需要执行以下步骤:

  1. 创建一些从db获取行的方法。你也可以回来 List<TableDataType>或直接Cursor
  2. 创建一些ListAdapter的子类以更好地控制它。
  3. ListAdapter设为ListView
  4. 实施例

    从db获取数据的方法:

    public List<DataType> getAll() {
       List<DataType> objects = new ArrayList<DataType>();
       DataType child = null;
       Cursor c = null;    
       try {
          String query = "select * from TableName";
          c = db.rawQuery(query, null);
          if (c.moveToFirst()) {
             child = new DataType();
             child.setId(c.getInt(c.getColumnIndex("id")));
             child.setName(c.getString(c.getColumnIndex("name")));
             objects.add(child);  
          }
          return objects;
       }
       finally {
          if (c != null) {
             c.close();
          }
          if (db != null) {
             db.close();
          }
       }
    }
    

    然后,您可以创建自己的BaseAdapter扩展适配器,并在TextView方法中将数据设置为getView()并创建RowHolder,它将是包含子项的任意对象(小部件) )每行

    public View getView(int position, View convertView, ViewGroup parent) {
       if (convertView == null) {
          // inflate convertView and add row to RowHolder
          // set RowHolder as tag of row .. convertView.setTag(rowHolder);
       }
       else {
          // just recycle views so get existing RowHolder
          rowHolder = (RowHolder) convertView.getTag();
       }
       // set data to widget(s)
       rowHolder.getFirstTextView().setText(dataSource.get(position).getId());
       ...
    
    }
    

    RowHolder可能看起来像

    public class RowHolder {
    
       private View row;
       private TextView idColumn;
    
       public RowHolder(View v) {
          this.row = v;
       }
    
       public TextView getIdColumn() {
          if (idColumn == null) {
             idColumn = (TextView) row.findViewById(R.id.idColumnId);
          }
          return idColumn;
    
    
       }
    }
    

    最后将Adapter设置为ListView并完成工作。

    注意:

    DataType是自己定义的对象。它在您的数据库中显示表,其中Object的属性与表中的列相同。

    还有其他方法并从db Cursor返回并使用SimpleCursorAdapterCursorAdapter。以下是很好的例子:

答案 2 :(得分:1)

您所能做的只是看看Bind the List view from Database with Cursor Adapter。 另请查看ListView Example using Cursor Adapter with SQLiteDatabase

我希望这能指导你。

感谢。