我有RecyclerView
来存储来自API
的内容。问题是从API返回的对象会根据与用户交互的用户而移动。
让我们举一个例子,让我们说我向API请求获取一个这样的列表:
{
"startTime": "2016-02-01 01:20:60",
"endTime": "2016-02-01 01:00:60",
"objects": [
{
"id": "4",
"image": "http://image.com/1",
"type": "image"
},
{
"id": "3",
"text": "Something something",
"type": "post"
},
{
"id": "2",
"text": "Something else",
"type": "post"
},
{
"id": "1",
"text": "Something",
"type": "post"
}
]
}
好的,存储在列表中, NOW 用户点击SwipeToRefresh
,这会从API返回:
{
"startTime": "2016-02-01 01:30:60",
"endTime": "2016-02-01 01:20:60",
"objects": [
{
"id": "8",
"image": "http://image.com/10",
"type": "image"
},
{
"id": "7",
"text": "Something new",
"type": "post"
},
{
"id": "3",
"text": "Something something",
"type": "post"
},
{
"id": "4",
"text": "Something something",
"type": "post"
}
]
}
请注意,Posts
的{{1>} 3 和 4 会在新列表中返回!我们需要以某种方式删除旧项目并优雅地使用这些项目更新列表。
实现这个的好设计是什么?有什么清洁和健壮吗?
我最初的预感是:
id
对此更好的想法?通过良好的设计,我的意思是更新列表,而无需用户注意任何jankiness或滞后。
请在downvoting或者回答之前仔细阅读这个问题,这听起来像个简单的问题。它没有。:
具体来说,我正在寻找有效内存分配,简单干净的流体接口和易于调试的答案。
一个理想的解决方案可能是一个基础'摘要' ' RecyclerViw.Adapter'它具有更新/删除/修改ViewHolder的逻辑。有线程安全。假设我已经在使用库来处理JSON / POJO序列化和客户端REST。
我的RecyclerView中的项目在从API返回的列表中反映的列表中移动。当用户从顶部刷新视图或在向下滚动时从底部加载更多视图时,项目会移动并且是动态的。项目在列表中不是静态的,它们的位置将根据从API返回的列表中反映的用户进行交互而发生变化。
答案 0 :(得分:1)
如果你想要漂亮流畅的设计,我会为你的应用创建一个Sqlite数据库。将数据存储在您从Web api调用获得的数据库中。每次用户向下滑动新数据,然后解析JSON并更新数据库。在后台线程中使用AsyncTask,service或IntentService而不是在Main(UI)线程上执行此操作。
现在使用CursorLoaders将您的RecyclerView与数据库中存储的项目连接起来。当然,你必须以这种方式做更多的工作,但最终还是值得的。
希望这将是一个很好的起点。答案 1 :(得分:0)
我会使用改造来从api获取我的对象,然后我会为你的api返回的对象创建一个Gson模型。类似的东西:
class Model{
private String startTime;
private String endTime;
private Post[] objects;
class Post{
private String id;
private String text;
private String type;
// get/set methods
}
// get/set methods
}
然后我将使用rxAndroid来修改我的列表。
See here on how to use rx with retrofit。我建议研究rxjava的flatmap,以便在Post[]
中解析你的对象。我不是rx的专家,所以我还不能给出一个例子。