在RecyclerView中动态更新非静态数据的最佳方法?

时间:2016-02-02 00:23:11

标签: android android-recyclerview android-adapter

我有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返回的列表中反映的用户进行交互而发生变化。

2 个答案:

答案 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的专家,所以我还不能给出一个例子。