2

通过创建一个新的android项目并选择master detail flow主题,这将提供一个关于如何使用这个主题的示例,这很好。我的问题是这个例子使用了静态数据,我需要它是动态的。我的应用程序使用异步任务从服务中获取 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”或两者中调用它(如果两者都不是多余的)或其他地方,有更好的解决方案吗?

4

3 回答 3

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));

}

你需要打电话DummyContent.setContext(getActivity())每当您需要初始化/更新/刷新 ITEMS 和 ITEM_MAP 时,也许,在刷新数据时调用ITEMS.clear()ITEM_MAP.clear()开头会有所帮助。setContext(Context)

我应该在 "kind_name_ListFragment.java" "onCreate" 或 "kind_name_DetailFragment.java" "onCreate" 或两者中调用它(如果两者都不是多余的)或其他地方

kind_name_ListFragment.onCreate(Bundle), before中调用一次setListAdapter(...)。无需再次调用它kind_name_DetailFragment.onCreate(Bundle)。当您需要更新/刷新数据时:

DummyContent.setContext(getActivity());
((YourAdapter)getListAdapter()).notifyDataSetChanged();
于 2013-09-07T08:12:18.363 回答
0

As you are already using the embedded database to store your data, Loader will be handy for you.

Update your SomethingListFragment and SomethingDetailFragment like the sample in this URL. You can dispose of the DummyContent class.

于 2013-09-09T03:21:34.707 回答
0

我通常会使用 CursorAdapter 连接到 ContentProvider,该 ContentProvider 使用下面的数据库来消除 DummyContent.class,但这有点复杂。

这应该有效: 1.) 在实例化 MyDbAdapter 时,您可能的意思是使用 activity.getApplicationContext() 作为 Context。这将使您的 MyDbAdapter 存储上下文,而不是您用来构造它。这也将允许您从以前无法调用的 AsyncTask 调用更新。2.) 每当您的 DummyContent.ITEMS 列表更新时,您都希望在 ArrayListAdapter 上调用 notifyDataChange() ,它将负责通知 ListView 更新其项目。

另外,如果您不喜欢这个答案:我认为您错过了关闭光标“c”。

于 2013-09-12T23:28:09.770 回答