2012-04-28 20 views
1

SQLiteデータベースからListViewを作成しましたが、各ListViewアイテムにリスナーを追加する方法に固執しています。そのアイテムがクリックされると、そのアイテムに関する詳細情報を持つ別のページを表示できます。データベースはほんの一例です。どんな助けもありがとう。ListViewにリスナーを追加する

public class Database extends ListActivity { 

private final String SAMPLE_DB_NAME = "myFriendsDb"; 
//private final String SAMPLE_TABLE_NAME = "friends"; 

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


    ArrayList<String> results = new ArrayList<String>(); 
    SQLiteDatabase db = null; 

    try { 
     db = this.openOrCreateDatabase(SAMPLE_DB_NAME, MODE_PRIVATE, null); 

     db.execSQL("CREATE TABLE IF NOT EXISTS people" + 
       " (LastName VARCHAR, FirstName VARCHAR," + 
       " Country VARCHAR, Age INT(3));"); 

     db.execSQL("INSERT INTO people" + 
       " Values ('Jones','Bob','UK',30);"); 
     db.execSQL("INSERT INTO people" + 
       " Values ('Smith','John','UK',40);"); 
     db.execSQL("INSERT INTO people" + 
       " Values ('Thompson','James','UK',50);"); 

     Cursor c = db.rawQuery("SELECT FirstName, LastName FROM people", null); 

     if (c != null) { 
      if (c.moveToFirst()) { 
       do { 
        String firstName = c.getString(c.getColumnIndex("FirstName")); 
        String lastName = c.getString(c.getColumnIndex("LastName")); 
        results.add("" + firstName + " " + lastName); 
       }while (c.moveToNext()); 
      } 
     } 

     this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,results)); 

    } catch (SQLiteException se) { 
     Log.e(getClass().getSimpleName(), "Could not create or Open the database"); 
    } finally { 
     if (db != null) 
      db.execSQL("DELETE FROM people"); 
      db.close(); 
    } 
} 

}

答えて

1

あなたの問題を解決するために多くの方法があります。これは、ListActivityのprotectedメソッドonListItemClick(ListView l、View v、int position、long id)を実装するだけです。

public class Database extends ListActivity { 

    //YOUR CODE ABOVE HERE... 

    public static final String SHOWITEMINTENT_EXTRA_FETCHROWID = "fetchRow"; 
    public static final int ACTIVITY_SHOWITEM = 0; /*Intent request user index*/ 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id){ 
     /* 
     position variable holds the position of item you clicked... 
     do your stuff here. If you want to send to another page, say another activity 
     that shows your stuff, you can always use an intent 
     example: 
     */ 
     Intent tmpIntent = new Intent(this, YourActivityForShowingItem.class); 
     tmpIntent.putExtra(SHOWITEMINTENT_EXTRA_FETCHROWID, position); 
     startActivityForResult(tmpIntent, ACTIVITY_SHOWITEM); 

    } 
} 

代わりに、あなたはgetListViewを()を使用してlistActivityのリストビューにアクセスすると、あなたは、通常のリストビューオブジェクトで行われているだろうとリスナーまたはコンテキストメニューのセッターを呼び出すことができます。例えば、このアプローチを使用してリスナーを設定します。この機能:

private void setMyListListener(){ 
    getListView().setOnItemClickListener(new OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> a, View v, int position, long id){ 
      /*same fake code as above for calling another activity using an intent:*/ 
      Intent tmpIntent = new Intent(this, YourActivityForShowingItem.class); 
      tmpIntent.putExtra(SHOWITEMINTENT_EXTRA_FETCHROWID, position); 
      startActivityForResult(tmpIntent, ACTIVITY_SHOWITEM); 
     } 
    }); 
} 

この機能は、あなたのクリックのリスナーが、同じように構成することにしたい場合は、その後、あなたのonCreate(...)関数によって呼び出すことができますあなたの活動の全期間。

+0

これは素晴らしい、完璧です!どうもありがとうございました。数時間前にここに投稿すると思っていたはずです! – user1362255

+0

ListViewでクリックしたアイテムの値を次のアクティビティに渡すにはどうすればよいですか? – user1362255

+0

上記のコードを参照してください。私は 'tmpIntent.putExtra(SHOWITEMINTENT_EXTRA_FETCHROWID、position)'行でクリックした項目の位置を送った。 'startActivityForResult'を介して呼び出された新しいアクティビティ(プレースホルダ名" 'YourActivityForShowingItem'"を使用)では、そのonCreate関数内で単に 'int tmpPos = getIntent()。getIntExtra(SHOWITEMINTENT_EXTRA_FETCHROWID、-1);を呼び出します。 '上の位置の整数を取得します(tmpPosは-1になります)。 – epichorns

関連する問題