Java 如何使用动态数据的主细节流主题?
通过创建一个新的android项目并选择masterdetailflow主题,这将提供一个关于如何使用这个主题的示例,这很好。我的问题是这个示例使用静态数据,我需要它是动态的。我的应用程序使用async task以JSON格式从服务获取数据,然后我将其解析并保存在phone DB中 这是DummyContent类:Java 如何使用动态数据的主细节流主题?,java,android,Java,Android,通过创建一个新的android项目并选择masterdetailflow主题,这将提供一个关于如何使用这个主题的示例,这很好。我的问题是这个示例使用静态数据,我需要它是动态的。我的应用程序使用async task以JSON格式从服务获取数据,然后我将其解析并保存在phone DB中 这是DummyContent类: public class DummyContent { /** * An array of sample (dummy) items. */ publi
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;
}
}
公共类DummyContent{
/**
*样本(虚拟)项的数组。
*/
公共静态列表项=新建ArrayList();
/**
*按ID显示的样本(虚拟)项目的地图。
*/
公共静态映射项_Map=newhashmap();
//静止的{
////添加3个示例项。
//增补项目(新项目(“1”、“项目1”);
//增补项目(新项目(“2”、“项目2”);
//增补项目(新项目(“3”、“项目3”);
// }
公共静态void setContext(Context c){
如果(db==null)db=newmydbadapter(c);//SQLiteOpenHelper+SQLiteDatabase管理器
if(db.isOpen()==false){
db.open();
游标c=db.getProfiles();//数据库查询
if(c.moveToFirst()){
做{
ProfileItem=新的ProfileItem(c.getString(0),c.getString(1),
c、 getString(2));
增编(项目);
}而(c.moveToNext());
}
}
}
专用静态无效添加项(DummyItem){
项目。添加(项目);
项目地图放置(项目id、项目);
}
/**
*表示一段内容的虚拟项。
*/
公共静态类DummyItem{
公共字符串id;
公共字符串内容;
公共DummyItem(字符串id、字符串内容){
this.id=id;
this.content=内容;
}
@凌驾
公共字符串toString(){
返回内容;
}
}
}
您可以看到,我对静态数据进行了注释,并添加了“setContext”,应该调用它来从DB添加数据。我的问题是,我应该在何时何地调用此函数,以便显示数据?我应该在“kind\u name\u ListFragment.java”“onCreate”或“kind\u name\u DetailFragment.java”“onCreate”或两者(如果两者都不是多余的话)或其他地方调用它,有更好的解决方案吗
我的问题是这个示例使用静态数据,我需要它
动态的
最简单的方法是在访问DummyContent.ITEMS
之前调用DummyContent.setContext(Context)
:
(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));
}
由于您已经在使用嵌入式数据库存储数据,所以Loader将非常方便
更新您的SomethingListFragment和SomethingDetailFragment,如此URL中的示例。您可以处理DummyContent类。我通常会使用CursorAdapter连接到ContentProvider,该ContentProvider在下面使用一个数据库,以消除DummyContent.class,但这有点复杂 这应该起作用: 1.)在实例化MyDbAdapter时,您可能想将activity.getApplicationContext()用于上下文。这将让MyDbAdapter存储上下文,而不是您用来构建它。这还允许您从以前无法调用的异步任务中调用更新。 2.)每当更新DummyContent.ITEMS列表时,您希望在ArrayListAdapter上调用notifyDataChange(),它将负责通知ListView更新其项目
另外,如果您不喜欢这个答案:我想您没有关闭光标“c” 您找到解决方案了吗?没有,我仍在等待帮助:(
DummyContent.setContext(getActivity());
((YourAdapter)getListAdapter()).notifyDataSetChanged();