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的一个好方法,对吗?不,我的问题与更新动态列表相关,列表中的项目会四处移动。因此,项目交换位置。