4

列 (_id、タイトルなど) を持つテーブル (カテゴリ) を持つデータベースを作成しました。データベースからこれらのカテゴリのデータを読み取り、ListView.

これが私のコードです:

   public class MainActivity extends listActivity{

    private ArrayAdapter arrayAdapter;
    ArrayList results = new ArrayList();
    ListView catlist;
    Cursor cur;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        catlist = getListView();

        int parentid = getIntent().getIntExtra("catid", 0);
        openAndQueryDatabase(parentid);

        displayCatListView();

    }

    private void displayCatListView() {

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


        catlist.setOnItemClickListener(new OnItemClickListener() {

               @Override
               public void onItemClick(AdapterView<?> parent, View v,
                 final int position, long id) {


                Toast.makeText(MainActivity.this,
                  "List View Clicked:" + position, Toast.LENGTH_LONG)
                  .show();
               }
              });     

    }

    private void openAndQueryDatabase(int parentid) {
        DataBaseHelper db = new DataBaseHelper(this);

        SQLiteDatabase dbr = db.getReadableDatabase();
        cur = dbr.rawQuery(
                "SELECT _id, title, has_sub FROM categories where parent_id=?",
                new String[] { String.valueOf(parentid) });


        if (cur != null) {
            while (cur.moveToNext()) {

                int cat_id = cur.getInt(cur.getColumnIndex("_id"));
                String cattitle = cur.getString(cur.getColumnIndex("title"));
                int has_sub = cur.getInt(cur.getColumnIndex("has_sub"));
                results.add(cat_id + cattitle + has_sub);
            }
            cur.close();
        }

        db.close();

    }
}
  1. アイテムの位置 onItemClick を取得できますが、行の _id onItemClick を取得したいと考えています。どうすればいいですか?
  2. 私はこれが初めてです。コードに間違いはありますか?

どうもありがとう。

4

2 に答える 2

12

代わりにCursorAdapter( http://developer.android.com/reference/android/widget/CursorAdapter.html ) を使用してください。ArrayAdapter を使用している場合はメモリ割り当てを超えており、db が変更された場合にも通知を受け取りません。

さらに、CursorAdapter を使用する場合は、

public void onItemClick(AdapterView<?> parent, View v, final int position, long id)

「id」パラメータは、テーブルの _id フィールドと一致します

行全体を取得するには

adapter.getItem(int position)
于 2013-07-13T19:12:37.880 に答える
1

それ以外の

int cat_id = cur.getInt(cur.getColumnIndex("_id"));
String cattitle = cur.getString(cur.getColumnIndex("title"));
int has_sub = cur.getInt(cur.getColumnIndex("has_sub"));
results.add(cat_id + cattitle + has_sub);

これらの値を含む Category クラスを作成し、パラメータ化された ArrayList を使用します。何かのようなもの

class Category {
    public int cat_id;
    public String cattitle;
    public int has_sub;

    public Category(int cat_id, ...) {
        // constructor logic here
    }
}

results.add(new Category(cat_id, cattitle, has_sub));

これにより、 onItemClickListener を次のように設定できます。

        catlist.setOnItemClickListener(new OnItemClickListener() {

           @Override
           public void onItemClick(AdapterView<?> parent, View v,
             final int position, long id) {
                 Category clickedCategory = results.get(position);
                 int id = clickedCategory.cat_id;

                 // do something with id
           }
          });     

ArrayList は ArrayAdapter のデータ ソースでpositionあり、クリックされたカテゴリのインデックスに対応します。

于 2013-07-13T18:14:26.820 に答える