Android 单击显示详细信息页面
我正在使用自定义游标适配器从数据库读入listview。listview显示数据库中每个条目的一些详细信息。单击列表项时,我希望打开一个详细信息页面,其中显示该记录在listview中未显示的其他详细信息。我想不出来 我已经附上了MainActivity中游标创建和适配器创建的代码片段。我还有一个单独的customAdapter类和一个用于详细信息页面的类 main活动:Android 单击显示详细信息页面,android,android-layout,android-intent,onclick,Android,Android Layout,Android Intent,Onclick,我正在使用自定义游标适配器从数据库读入listview。listview显示数据库中每个条目的一些详细信息。单击列表项时,我希望打开一个详细信息页面,其中显示该记录在listview中未显示的其他详细信息。我想不出来 我已经附上了MainActivity中游标创建和适配器创建的代码片段。我还有一个单独的customAdapter类和一个用于详细信息页面的类 main活动: public class MainActivity extends ListActivity { ....
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);
}
});
}
}
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);
}
在这一行之后:
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
接收要检索的extra的键加上默认值。总是有必要对照默认值检查返回值,以确保活动实际收到了一些内容
所以,下次记住这一点。。。创建意图不会启动它所代表的活动(您必须使用startActivity
或startActivityForResult
方法)。此外,您还可以将数据传递给将要使用Intent的extras启动的活动。它可以是基本类型、字符串、字符串的ArrayList或地块(单个对象、数组列表或数组)
细节
要获得产品的详细信息,您可以使用以下内容:
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
}
您应该创建一个类,用相同的字段表示数据库中的每个数据。然后您将能够在适配器中使用它,并且您将更容易地执行您想要的操作,因为您将能够使用整数
位置
方法检索到ontimeclick()
方法。
然后您只需将其放入
意图
,在第二个活动中,您可以使用它来显示列表视图
未显示的其他信息(字段)。我刚刚实现了您上面的内容,它启动了新的活动。我现在只需要填充字段。你会推荐我实现它的方法还是有更好的方法?我推荐这种方法,因为它更快。不过,正如miNde所建议的,如果您创建一个表示表中每一行的类,可能会更容易理解(但肯定会慢一些)。另外,如果您听从他的建议,请阅读关于Parcelable接口(我不建议使用可序列化接口),因为您将需要它以这种方式进行操作。很抱歉打扰您,但是您能给我一些关于使用长id
从数据库获取项目的建议吗?我好像没法超越你,伙计,没问题。请编辑您的问题并添加db.getData()方法的代码。好的。。。我想这应该对你有帮助。因为我没有时间,所以我没有编译这个。