Listview由sql db填充onListItemClick以填充其他活动中的textview

时间:2012-10-07 15:40:45

标签: android sqlite listview textview onclicklistener

我正在从数据库的名称填充列表视图。这一切都很好。点击名单后的Listitem后,我想设置onListItemClick以填写其他活动中的文字视图。这就是我被困住的地方。

这是我的listview活动的代码:

public class DataListView extends ListActivity {

private ArrayList<String> results = new ArrayList<String>();

private SQLiteDatabase newDB;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.hotelslist);

    openAndQueryDatabase();

    displayResultList();


}
private void displayResultList() {
    ListView hotelslist = (ListView) findViewById(android.R.id.list);
    hotelslist.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, results));
   getListView().setTextFilterEnabled(true);



}

 @Override
  public void onListItemClick(ListView l, View v, int position, long id) {

     super.onListItemClick(l, v, position, id);
      Toast.makeText(getBaseContext(), l.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();


  }

private void openAndQueryDatabase() {
    try {

        DataBaseHelper newDB = new DataBaseHelper(this, "mydatabase.sqlite");

        SQLiteDatabase sdb = newDB.getReadableDatabase();


        Cursor c = sdb.rawQuery("SELECT name FROM hotel ORDER BY name ASC", null);



if (c != null ) {
    if  (c.moveToFirst()) {
        int i = 0;
        do {
            i++;
            String name = c.getString(c.getColumnIndex("name"));


            results.add(name);
        }while (c.moveToNext());
    } 

}       



    } catch (SQLiteException se ) {
        Log.e(getClass().getSimpleName(), "Could not create or Open the database");
    } finally {
        if (newDB != null) 

            newDB.close();
    }

}

} 

除了名称,该表还包含“地址”和“电话”列。这个数据我希望用以下xml填写另一个活动的textfill“addressfill”和“telephonefill”:

<?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="horizontal" >
 <TextView
    android:id="@+id/name"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
     />
 <TextView
    android:id="@+id/address"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Address" />
 <TextView
    android:id="@+id/addressfill"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
  <TextView
    android:id="@+id/telephone"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Telephone number" />
  <TextView
    android:id="@+id/telephonefill"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />


</LinearLayout>

我试着阅读很多教程,这里有很多帖子,但没有找到合适的答案。

我需要使用哪些代码用于onListItemClick和我使用我提供的xml的活动。非常感谢帮助!

2 个答案:

答案 0 :(得分:1)

如果要在列表项上设置侦听器,则需要扩展数组适配器并将侦听器代码放在适配器中:

public class SettingsListAdapter extends ArrayAdapter<String> {

     @Override
     public View getView(int position, View convertView, ViewGroup parent){
          // put your listener in here
                  mybutton.setOnClickListener(new View.OnClickListener() {          
                @Override
                public void onClick(View v) {
                    // do work here
                }

     }


}

换句话说,simplelistadapter不足以满足您的需求,您需要创建自己的。

修改

以下是创建自定义ArrayAdapter的一个很好的示例:Custom Array Adapter Tutorial

答案 1 :(得分:0)

onListItemClick()中创建一个Intent并将名称放在Intent中:

Intent intent = new Intent(DataListView.this, SecondActivity.class);
intent.putExtra("name", l.getItemAtPosition(position).toString());
startActivity(intent);

您必须将SecondActivity更改为将接收该名称的活动的班级名称。

在第二个活动的onCreate()中,阅读字符串:

String name = getIntent().getStringExtra("name");
if(name != null) {
    // Do something with the name, like selecting the address 
    //   and telephone number from your database to display
}

但是,由于您正在使用数据库,因此您应该使用SimpleCursorAdapter。使用Cursor更有用,更有效。


  

我怎样才能为地址和电话等表的其他列数据做到这一点?

您有两种选择:

  1. 在您的第二个Activity中使用如下查询:

    "SELECT address, telephone FROM Hotel WHERE name = '" + name + "'"
    

    但如果多家酒店名称相同,您将获得多个地址......

  2. 将您的第一个活动中的查询更改为:

    "SELECT name, address, telephone FROM Hotel ORDER BY name"
    

    现在在onListItemClick(),您可以同时传递姓名,地址和电话号码,但您需要在某处存储地址和电话号码......这是SimpleCursorAdapter所在的位置非常有用。