通过创建一个新的Android项目并选择主详细信息流主题,这将提供有关如何使用此主题的示例,这很好。我的问题是这个例子使用静态数据,我需要它是动态的。我的应用程序使用异步任务以JSON格式从服务获取数据,然后我将其解析并保存在手机数据库中。
这是DummyContent类:
public class DummyContent {
/**
* An array of sample (dummy) items.
*/
public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();
/**
* A map of sample (dummy) items, by ID.
*/
public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
// static {
// // Add 3 sample items.
// addItem(new DummyItem("1", "Item 1"));
// addItem(new DummyItem("2", "Item 2"));
// addItem(new DummyItem("3", "Item 3"));
// }
public static void setContext(Context c) {
if (db == null) db = new MyDbAdapter(c); // SQLiteOpenHelper + SQLiteDatabase manager
if (db.isOpen() == false) {
db.open();
Cursor c = db.getProfiles(); // database query
if (c.moveToFirst()) {
do {
ProfileItem item = new ProfileItem(c.getString(0), c.getString(1),
c.getString(2));
addItem(item);
} while (c.moveToNext());
}
}
}
private static void addItem(DummyItem item) {
ITEMS.add(item);
ITEM_MAP.put(item.id, item);
}
/**
* A dummy item representing a piece of content.
*/
public static class DummyItem {
public String id;
public String content;
public DummyItem(String id, String content) {
this.id = id;
this.content = content;
}
@Override
public String toString() {
return content;
}
}
}
你可以看到我评论了静态数据并添加了“setContext”,应该调用它来从DB添加数据。我的问题是我应该在何时何地调用此函数以便显示数据?我应该在“kind_name_ListFragment.java”“onCreate”或“kind_name_DetailFragment.java”“onCreate”或两者(如果两者都不是多余的)或其他地方调用它并且是否有更好的解决方案?
答案 0 :(得分:1)
我的问题是这个例子使用静态数据,我需要它 动态
最简单的方法是在访问DummyContent.setContext(Context)
之前致电DummyContent.ITEMS
:
(kind_name_ListFragment.java)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Call to initialize DummyContent.ITEMS
DummyContent.setContext(getActivity());
setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1, DummyContent.ITEMS));
}
每当需要初始化/更新/刷新ITEMS和ITEM_MAP时,您都需要致电DummyContent.setContext(getActivity())
。也许,在ITEMS.clear()
开头调用ITEM_MAP.clear()
和setContext(Context)
会有助于刷新数据。
我应该在“kind_name_ListFragment.java”“onCreate”中调用它吗? “kind_name_DetailFragment.java”“onCreate”或两者(如果两者都没有 多余的)或其他地方
在kind_name_ListFragment.onCreate(Bundle)
之前,在setListAdapter(...)
之前调用一次。无需在kind_name_DetailFragment.onCreate(Bundle)
中再次调用它。当您需要更新/刷新数据时:
DummyContent.setContext(getActivity());
((YourAdapter)getListAdapter()).notifyDataSetChanged();
答案 1 :(得分:0)
由于您已经在使用嵌入式数据库来存储数据,因此Loader对您来说非常方便。
更新您的SomethingListFragment和SomethingDetailFragment,就像此网址中的示例一样。你可以处理DummyContent类。
答案 2 :(得分:0)
我通常会使用一个连接到ContentProvider的CursorAdapter,它使用下面的数据库来消除DummyContent.class,但这需要更多一些。
这应该有效: 1.)您可能意味着在实例化MyDbAdapter时使用activity.getApplicationContext()作为Context。这将使您的MyDbAdapter存储上下文,而不是用于构建它。这也可以让您从以前无法访问的AsyncTask中调用更新。 2.)每当更新DummyContent.ITEMS列表时,你想在ArrayListAdapter上调用notifyDataChange(),它将负责通知ListView更新其项目。
此外,如果您不喜欢这个答案:我认为您错过了关闭光标“c”。