0

カスタムカーソルアダプタを使用して、データベースからリストビューに読み込んでいます。リストビューには、データベースの各エントリの詳細が表示されます。リストアイテムをクリックすると、リストビューに表示されていないそのレコードの他の詳細を表示する詳細ページを開きたいです。私はそれを理解することはできません。

MainActivityにあるカーソル作成とアダプター作成のコードスニペットを添付しました。また、個別のcustomAdapterクラスと詳細ページ用のクラスがあります。

主な活動:

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

        ...
        ...  
    }

    private void fillList() {
        ListView lv = getListView();

        Cursor c = db.getData();
        startManagingCursor(c);

        CustomCursorAdapter adapter = new CustomCursorAdapter(getApplicationContext(), c);
        lv.setAdapter(adapter);

        lv.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                Intent k = new Intent(MainActivity.this, ProductDetails.class);
            }
        });
    }

}

CustomCursorAdapter:

public class CustomCursorAdapter extends CursorAdapter {

        public CustomCursorAdapter(Context context, Cursor cursor) {
            super(context, cursor);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            LayoutInflater inflater = LayoutInflater.from(context);
            View v = inflater.inflate(R.layout.list_entry, parent, false);
            bindView(v, context, cursor);
            return v;
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            TextView txtvw1 = (TextView)view.findViewById(R.id.prodcode_entry);
            txtvw1.setText(cursor.getString(cursor.getColumnIndex(ProdDB.KEY_PRODCODE)));

            TextView txtvw2 = (TextView)view.findViewById(R.id.prodtype_entry);
            String ptype = (cursor.getString(cursor.getColumnIndex(ProdDB.KEY_PRODTYPE)));
            txtvw2.setText(ptype.substring(0, 1));

            TextView txtvw3 = (TextView)view.findViewById(R.id.prodcat_entry);
            String cat = (cursor.getString(cursor.getColumnIndex(ProdDB.PRODCAT)));
            txtvw3.setText(cat.substring(0, 2));

            TextView txtvw4 = (TextView)view.findViewById(R.id.prodcost_entry);
            float price = (cursor.getFloat(cursor.getColumnIndex(ProdDB.PRODPRICE)));
            txtvw4.setText(Float.toString(price));

            TextView txtvw5 = (TextView)view.findViewById(R.id.prodSup_entry);
            txtvw5.setText(cursor.getString(cursor.getColumnIndex(ProdDB.SUPPLIER)));
        }
}

ProdDetails

public class ProductDetails extends Activity {

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

        setContentView(R.layout.product_details);
    }
}

db.getData()-ProdDBから

public Cursor getData() {
        String[] columns = new String[] {KEY_ROWID, 
                KEY_PRODCODE,
                KEY_PRODNAME,
                KEY_PRODTYPE,
                KEY_PRODCAT,
                KEY_PRODPRICE,
                KEY_PRODRRP,
                KEY_PRODSUPPLIER,
                KEY_NOTES};

        return db.query(DB_TABLE, columns, null, null, null, null, null);
    }
4

2 に答える 2

2

この行の後:

Intent k = new Intent(MainActivity.this, ProductDetails.class);

アイテムのIDも渡します。

k.putExtra("item_id", id);
// and start the activity
startActivity(k);

次に、ProductDeftailsアクティビティ内からIDを再度取得し、データベースにクエリを実行して、その情報を取得します。

// after setContentView...
long id = getIntent().getLongExtra("item_id", 0);
// use this variable to get the item again and populate your views

getLongExtra取得するエクストラのキーとデフォルト値を受け取ります。戻り値をデフォルト値と照合して、アクティビティが実際に何かを受け取ったことを確認することは常に価値があります。

したがって、次回はこれを覚えておいてください...インテントを作成しても、それが表すアクティビティは起動されません(startActivityまたはstartActivityForResultメソッドのいずれかを使用する必要があります)。また、インテントのエクストラを使用して起動される予定のアクティビティにデータを渡すことができます。プリミティブ型、文字列、文字列のArrayLists、またはParcelables(単一オブジェクト、配列リスト、または配列)にすることができます。

詳細

製品の詳細を取得するには、次のようなものを使用できます。

String[] columns = new String[] {KEY_ROWID, 
        KEY_PRODCODE,
        KEY_PRODNAME,
        KEY_PRODTYPE,
        KEY_PRODCAT,
        KEY_PRODPRICE,
        KEY_PRODRRP,
        KEY_PRODSUPPLIER,
        KEY_NOTES};
return db.query(DB_TABLE, columns, KEY_ROWID + " = ?", new String[]{String.valueOf(id)}, null, null, null);

getDetails(long id)これを(ProdDBクラス内)という新しいメソッド内に配置できます。次に、アクティビティ内から次のことができます。

Cursor cursor = db.getDetails(id);
if(cursor.moveToFirst()){
    // I assume you had already created the views in the ProductDetails activity
    txtvw1.setText(cursor.getString(cursor.getColumnIndex(ProdDB.KEY_PRODCODE)))
} else {
    // something went wrong, do something
}
于 2012-11-07T21:13:03.423 に答える
0

同じフィールドを使用して、データベース内の各データを表すクラスを作成する必要があります。onItemClick()そうすれば、アダプターでそれを使用できるようになり、整数を使用してメソッドで取得できるようになるため、やりたいことがはるかに簡単になりますposition。次に、それをに入れる必要がありIntentます。2番目のアクティビティでは、それを使用して、が表示されない他の情報(フィールド)を表示できますListView

于 2012-11-07T21:17:59.670 に答える