保持应用程序中实际数据的最佳方法

时间:2016-04-12 19:54:04

标签: android android-fragments system.reactive

我面临着应用程序中数据相关性的一些问题。

在我们的应用中,我们有1个活动和许多片段。

例如,我们有1个片段与User列表和那里的按钮(有3个状态:none / like / favorite)。 在下一页中,我们也有User和like按钮的完整描述。 如果我们按下userList中的按钮,就没有问题,在详情屏幕中我们看到正确的状态。但是,如果我们点击用户详细信息中的按钮并返回列表,那么此处仍有过去的数据。

我们不能使用activityForResult因为片段。

我们使用rx,也许有一些方法可以轻松解决这个问题?

enter image description here

3 个答案:

答案 0 :(得分:1)

为了重用Fragment UI组件,您应该将每个组件构建为一个完全独立的模块化组件,以定义自己的布局和行为。然后,每个Fragment都可以将数据传递给Activity,而Activity也可以将数据发送到Fragment

在您的情况下,Activity可以保存实际数据。当用户修改详细信息Fragment中的内容时,Fragment应该将其与Activity相关联。然后,Activity会通知列表Fragment

答案 1 :(得分:0)

实际上,您可以对片段使用$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.airtable.com/v0/appQmOEr6c6AV4X47/foo'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); $headers = array(); $headers[] = 'Authorization: Bearer YOUR_API_KEY'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close ($ch); 方法。我在不同的项目中已经看过几次这种模式,由你来决定它是否适合你。

假设您的左侧片段为onActivityResult()且您的右侧片段为AFragment,这就是想法。

(1)在BFragment中,在将事务从A提交到B之前设置目标片段:

AFragment

(2)提供Fragment bFragment = new BFragment(); bFragment.setTargetFragment(this, 42); // `this` is your AFragment instance // transact here

onActivityResult()

(3)在BFragment中,在@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // your logic here } 中准备数据并在目标上调用onDetach()

onActivityResult()

这样,每当@Override public void onDetach() { super.onDetach(); if (getTargetFragment() != null) { Intent data = new Intent(); // pass your data here getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, data); } } 弹回时,您的BFragment都有机会处理其数据。

答案 2 :(得分:0)

我在应用程序中处理这种情况的方法是使用SharedPreferences的中央“存储库”来跨多个屏幕存储序列化数据。然后,每次创建或恢复新的Activity(或在您的情况下,Fragment)时,它都会进入序列化数据仓库以填充其共享数据。

这就是我想象这会对你的情况起作用的方式。要使用“用户”示例,我将创建一个SharedPreferences文件来存储我的用户数据对象列表。所以我会有一个课程,存储我需要知道的关于用户的所有信息 - 他们的信息,他们的“喜欢”状态等。

假设我在某个List中有用户,我只想用Gson序列化,并将序列化数据保存到我创建的SharedPreferences中。然后,每个片段只能轮询序列化数据以获得用户的当前状态。如果进行了一些更改,每个Fragment会将数据保存回相同的SharedPreferences文件,以便其他Fragment可以使用它来实例化其视图。

这是一些伪代码......

//Some kind of data class for User
class MyUser {
    String name;
    String location;
    String likeStatus;
    //... whatever else
}

然后,假设你有一个用户列表,我会序列化该列表并将其存储在像这样的全局SharedPreferences文件中......

//ArrayList<MyUser> users <- defined somewhere
Gson gson = new Gson();
String usersJson = gson.toJson(users);
SharedPreferences userPrefs = getSharedPreferences("users_storage", MODE_PRIVATE);
SharedPreferences.Editor editor = userPrefs.edit();
editor.putString("users_data_key", usersJson);
editor.apply();

然后当加载一个新的Fragment并且它需要知道用户的当前状态时,它只是打开SharedPreferences文件并获取这样的所有内容的当前状态......

SharedPreferences userPrefs = getSharedPreferences("users_storage", MODE_PRIVATE);
String usersJson = userPrefs.getString("users_data_key", null);

Type collectionType = new TypeToken<ArrayList<MyUser>>(){}.getType();
ArrayList<MyUser> users = gson.fromJson(usersJson, collectionType);

为了清楚起见,这种方法将在您的Activity中完成,当您启动新的Fragment时,您只需传入正确实例化所需的数据。然后,如果Fragment需要保存数据,它只需调用Activity的方法并将其传递给需要保存的数据,而Activity将执行上面的代码来保存它。