如何使用动态数据的主细节流主题?

时间:2013-09-04 20:16:09

标签: java android

通过创建一个新的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”或两者(如果两者都不是多余的)或其他地方调用它并且是否有更好的解决方案?

3 个答案:

答案 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”。