我有一个带有ListView的Android应用。每行都是由SQLIte查询结果以dinamically方式生成的。当用户单击某个项目时,该应用程序应使用该项目的“内容”刷新列表,由另一个SQLite查询生成,依此类推。 我试图“刷新”创建新意图的活动并将其发送到同一活动。活动名称是ShopActivity
ListView list_content = ((ListView)findViewById(R.id.listforshop));
list_content.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// ID and text of selected item
long selected_id = id;
String selected_name = (String) ((TextView) view.findViewById(R.id.element)).getText();
// New intent
Intent intent = getIntent();
intent.setClassName(ShopActivity.this, ShopActivity.class.getName());
// Passing data and refreshing activity
intent.putExtra("id", selected_id);
intent.putExtra("name", selected_name);
intent.putExtra("type", "");
startActivity(intent);
}
});
通过这种方式,LogCat向我展示了很多关于Bundle的警告。似乎app无法启动活动。
还有另一种“刷新”ListView的方法吗?这个实现是否正确?
答案 0 :(得分:1)
// New intent
Intent intent = getIntent();
intent.setClassName(ShopActivity.this, ShopActivity.class.getName());
这不会产生新的Intent,这会重用现有的...重新使用这样的Intent会在你恢复这个Activity时引发很多警告和异常。要创建新的Intent,您需要使用关键字new
。
但是你真的不需要重新加载你的整个Activity,只需获取一个新的Cursor并使用CursorAdapter#swapCursor()
刷新你的ListView。
答案 1 :(得分:0)
尝试刷新ListView
时,您应该考虑使用适配器的notifyDataSetChanged()
。此方法告诉适配器提供的数据已更改,并且应更新列表视图。
因此,您应该将新数据添加到适配器,然后调用此方法。
答案 2 :(得分:0)
听起来您正在查看详细信息,请勿使用相同的活动来查看它们。添加一个新的ShopDetailActivity
并在用户点击该用户,这样用户可以按回去转到原始列表(加上获得漂亮的过渡动画)。
答案 3 :(得分:0)
处理列表和细节的另一种方法是使用Fragments。这样做的好处是,在大屏幕设备上,列表和细节可以同时显示。
使用一个Activity来显示列表和详细信息很麻烦。至少,使用两个活动。