Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在RecyclerView中动态更新非静态数据的最佳方法?_Android_Android Recyclerview_Android Adapter - Fatal编程技术网

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

Android 在RecyclerView中动态更新非静态数据的最佳方法?,android,android-recyclerview,android-adapter,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": "im

我有一个
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"
   }
   ]
}
好的,它存储在列表中,现在用户点击
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"
   }
   ]
}
请注意,id为
3和4
帖子将返回到新列表中!我们需要以某种方式删除旧项目,并用这些项目优雅地更新列表

实现这一点的好设计是什么?有干净、结实的东西吗

我最初的预感是:

adapter.update(List<Object> newObjects);

// Later on in adapter...

void update(List<Object> newObjects) {

    // Add items to the top of the list

    // Sort through old list and if ids match newer items remove them
    loop {
        // Call notifyItemRemoved
    }
}
adapter.update(列出新对象);
//稍后在适配器中。。。
无效更新(列出新对象){
//将项目添加到列表的顶部
//对旧列表进行排序,如果ID与新项目匹配,则删除它们
环路{
//调用notifyItemRemoved
}
}
有更好的想法吗?所谓良好的设计,我指的是在用户没有注意到任何刺耳或延迟的情况下更新列表

请在否决或回答之前仔细阅读问题,这可能听起来像一个简单的问题。不是这样。

具体来说,我正在寻找解决有效内存分配、简单干净流畅的界面和易于调试的问题的答案

理想的解决方案可能是一个基本的“抽象”“RecyclerView.Adapter”,它拥有更新/删除/修改具有线程安全性的“ViewHolder”的逻辑。假设我已经在使用库来处理JSON/POJO序列化和客户端REST


my RecyclerView中的项目在从API返回的列表中反映出来的列表中移动。当用户从顶部刷新视图或向下滚动时从底部加载更多视图时,项目会四处移动,并且是动态的。列表中的项目不是静态的,它们的位置将根据用户与这些项目的交互而变化,这反映在API返回的列表中。

如果您希望设计美观流畅,我将为您的应用程序创建一个Sqlite数据库。将从web api调用获得的数据存储在数据库中。每次用户向下滑动寻找新数据时,解析JSON并更新数据库。在后台线程中而不是在主(UI)线程中使用AsyncTask、service或IntentService执行此操作

现在,使用游标装入器将RecyclerView与数据库中存储的项目连接起来。当然,你必须用这种方式做更多的工作,但最终还是值得的


希望这将是一个良好的起点

我将使用改型从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修改我的列表


。我建议学习rxjava的平面图,以便在
Post[]
中解析对象。我不是rx方面的专家,所以我还不能给出一个例子。

为什么投票被否决?我知道这有一个基本的答案,就是我上面列出的,但我正在寻找一个更完美的答案,因为我的应用程序处理复杂的数据和动态视图。你应该保持ID不变,并向你的数据表添加一个最新更新的时间戳,就像一个合法的问题一样,把你的票投回零似乎比拿着一张白纸要密集一点?而且这根本不能解决这个问题,我认为它确实回答了这个问题。您正在寻找一种轻松更新视图的方法,对吗?用巴维克的回答,您只需输入数据的新光标即可获得更新。是的,但我相信OP也希望得到一个解决方案,其中被更新的项尽最大努力保持其在列表中的原始位置……这样用户就不会看到它跳跃。这与我的问题完全无关。@AndyRoid正在使用rx not更新列表相关?@AndyRoid如果我错了,请纠正我,但你的问题是如何为每个api调用更新recyclerview的一个好方法,对吗?不,我的问题与更新动态列表相关,列表中的项目会四处移动。因此,项目交换位置。