从Cursor填充ListView

时间:2011-03-17 05:35:07

标签: java android xml listview

我一直在这里看了很长时间,我找不到问题的答案。有许多类似的问题。但我无法提出任何有效的解决方案。我是android / java编程的新手,所以我非常感谢任何帮助。

背景:我有一个包含2个列表视图的活动屏幕。第一个listview包含来自数据库的名称列表。 (这是正常的)。

然后,当用户单击列表中的某个名称时,onItemClick事件将触发并根据与该名称关联的所有数据构建游标。 (已经验证我正在获得有效结果的光标)。

问题:当我尝试将结果光标放入SimpleCursorAdapter以将我的listadpter设置为时,我没有收到任何错误,但是我没有在屏幕上显示任何内容。

我有来自SQLite数据库的数据。它只有4个列,X行数。我想做的就是在列表中显示所有内容,然后进行一些分析。

这是我的代码:

public class TipCalculator_w_Database extends Activity    {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.databaseinfoscreen);

    ListView lv1 = null;
    lv1 = (ListView) findViewById (R.id.List1);
    final ListView lv2;
    lv2 = (ListView) findViewById (R.id.List2);


    final DataBase showData = new DataBase(getApplicationContext());
    showData.open();

    Cursor NameList = showData.GetAllNames();
    startManagingCursor(NameList);

    // Create an ArrayAdapter, that will actually make the Strings above
    // appear in the ListView
        int i = NameList.getCount();
        String[] FinalString = new String[i];
        int j = 0;
        while (NameList.moveToNext()) {

                FinalString[j] = NameList.getString(0);
                j++;
        }
        if(j != 0)
        {
            lv1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_gallery_item, FinalString));  
        }
        NameList.close();
        showData.close();

        lv1.setOnItemClickListener(new OnItemClickListener() {
          public void onItemClick(AdapterView<?> parent, View view,
              int position, long id) {
              String selectedName = ((TextView) view).getText().toString();
              Context ctx= parent.getContext();
              final DataBase showData = new DataBase(getApplicationContext());
              showData.open();
            final String[] columns = new String[] { showData.KEY_ROWID, showData.KEY_NAME, showData.KEY_BILL, showData.KEY_TIP};
            final int[] to = new int[] { R.id.ID_list, R.id.Name_list, R.id.Bill_list, R.id.Tip_list};

              Cursor NewEntry = showData.GetRowByName(selectedName);
              startManagingCursor(NewEntry);

                lv2.setAdapter(new SimpleCursorAdapter(ctx, R.layout.listlayout, NewEntry, columns, to));

              showData.close();
              NewEntry.close();

    // Back Button Functionality
    Button backButton = (Button) findViewById(R.id.Back);   
    backButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
     Intent myIntent = new Intent(v.getContext(), Tipscreen.class);
     startActivityForResult(myIntent, 0);
    }
}
);
}

}

这是我的XML文件

listlayout.xml

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
        <TextView
            android:id="@+id/ID_list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10px" />
        <TextView
            android:id="@+id/Name_list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10px" />
           <TextView
            android:id="@+id/Bill_list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10px" />
           <TextView
            android:id="@+id/Tip_list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10px"/> </LinearLayout>

- databaseinfoscreen.xml -

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
  <LinearLayout
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_weight="1">
<ListView android:text="List" android:id="@+id/List1" android:layout_width="wrap_content" android:textSize="18px" android:layout_height="fill_parent">
</ListView>  
  </LinearLayout>
  <LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1">
<ListView android:text="List" android:id="@+id/List2"  android:layout_width="wrap_content" android:textSize="18px" android:layout_height="fill_parent">
</ListView>  
  </LinearLayout>
  <RelativeLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1">
     <Button android:text="@string/back" android:layout_alignParentBottom="true" android:id="@+id/Back" android:layout_width="wrap_content" android:textSize="18px" android:layout_height="40px"></Button>  
    </RelativeLayout>
</LinearLayout>

希望这已经足够了,如果需要更多信息,请告诉我。我正在获取光标中所需的所有信息,它只是没有显示。我愿意采取其他方式来做到这一点。但是,我不能使这个特定的类扩展ListActivity,因为它需要扩展活动。

另外值得注意。我已经能够使用以下代码行显示到该列表视图。不幸的是,这只显示一列而不是我想要的所有列。

lv2.setAdapter(new ArrayAdapter<String>(ctx, android.R.layout.simple_gallery_item, FinalString));

其中FinalString只是数据库中被操作为数组的完整数据列。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好吧,因为没有人回应,我想我自己会回答这个问题。

以下是步骤,我已经为不同的项目工作,所以我将总结一下。如果有人需要,我可以详细介绍。

XML:

<ListView android:text="List" android:id="@+id/android:list" android:layout_width="wrap_content" android:scrollbars="horizontal" android:textSize="18px" android:layout_height="fill_parent" android:minHeight="120px">
</ListView>  

步骤1:创建光标并使用DB功能(未显示)填充

    String dbCount = showData.getTotalCount();
    Cursor GetAllData = showData.GetAllData();
    startManagingCursor(GetAllData);

步骤2:创建一个包含一堆get值的ArrayList,并用光标中的项填充列表。

        int i = GetAllData.getCount();

        ArrayList<DB_Get_Values> dbList = new ArrayList<DB_Get_Values>();

        while (GetAllData.moveToNext()) {
            DB_Get_Values w = new DB_Get_Values(GetAllData.getString(0), GetAllData.getString(1), GetAllData.getString(2));
            dbList.add( w );
            j++;
        }

步骤3:创建将用于控制列表视图显示的适配器类

          DBAdapter T_Adapter = new DBAdapter( 
                this,
                dbList ); 
        setListAdapter( T_Adapter );
        GetAllData.close();

DB_Get_Values类:充满了Getters

public class DB_Get_Values {

  public String P_Key = "";
  public String Mac_addr = "";
  public String SDK_VRS = "";

 public DB_Get_Values( String P_Key, String Mac_addr, String SDK_VRS) 
  {
    this.P_Key = P_Key;
    this.Mac_addr = Mac_addr;
    this.SDK_VRS = SDK_VRS;
 }
  public String get_Mac_addr() {
    return Mac_addr;
  }
  public String get_P_Key() {
    return P_Key;
  }
  public String get_SDK_VRS() {
        return SDK_VRS;
      }
}

类DBAdapter:获取要放入列表视图的值,并允许以编程方式控制显示。

class AdapterView extends LinearLayout {        
        public AdapterView(Context context, 
                DB_Get_Values list ) {
            super( context );

            this.setOrientation(HORIZONTAL);        

            LinearLayout.LayoutParams PkeyParams = 
                new LinearLayout.LayoutParams(40, LayoutParams.WRAP_CONTENT);
            PkeyParams.setMargins(1, 1, 1, 1);

            TextView Pkey = new TextView( context );
            Pkey.setText( list.get_P_Key() );
            Pkey.setTextSize(14f);
            Pkey.setTextColor(Color.WHITE);
            addView( Pkey, PkeyParams);

            LinearLayout.LayoutParams MacAddrParams = 
                new LinearLayout.LayoutParams(100, LayoutParams.WRAP_CONTENT);
            MacAddrParams.setMargins(1, 1, 1, 1);
            TextView MacAddr = new TextView( context );
            MacAddr.setText( list.get_Mac_addr() );
            MacAddr.setTextSize(14f);
            MacAddr.setTextColor(Color.WHITE);
            addView( MacAddr, MacAddrParams);

            LinearLayout.LayoutParams SDK_VRSParams = 
                new LinearLayout.LayoutParams(20, LayoutParams.WRAP_CONTENT);
            SDK_VRSParams.setMargins(1, 1, 1, 1);
            TextView SDK_VRS = new TextView( context );
            SDK_VRS.setText( list.get_SDK_VRS() );
            SDK_VRS.setTextSize(14f);
            SDK_VRS.setTextColor(Color.WHITE);
            addView( SDK_VRS, SDK_VRSParams);
}
}
public class DBAdapter extends BaseAdapter {

    private Context context;
    private List<DB_Get_Values> list;

    public DBAdapter(Context context, List<DB_Get_Values> list ) {
        this.context = context;
        this.list = list;
    }

    public int getCount() {
        return list.size();
    }

    public Object getItem(int position) {
        return list.get(position);
    }

    public long getItemId(int position) {
        return position;
    }
}

第5步:你现在完成了!更改AdapterView类中的参数以修改其外观。希望这有助于某人。