首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在安卓GridAdapter更新特定项目

在安卓GridAdapter更新特定项目
EN

Stack Overflow用户
提问于 2021-03-17 20:09:19
回答 1查看 34关注 0票数 0

我有一个项目,其中带有Tasmota固件的设备正在发送MQTT JSON格式的消息,这些消息在我的项目中使用.put方法构建JSONArray。稍后,JSONArray更改被传播到调用notifyDataSetChanged()的GridView适配器。

所面临的挑战是保持JSONArray结构不变,但以不同于初始JSONArray结构的顺序到达的数据是最新的(新的MQTT消息到达)。其结果是JSONArray embedded JSONObjects的顺序会动态改变,gridView的顺序也会改变,这会让用户感到困惑。在时间上,我试图通过以下方式解决这个问题:从从JSONArray发送更新的设备中删除最新的JSON消息,方法是调用.remove并重新添加更新的Json对象,调用.put方法+调用notifyDataSetChanged()以反映GridView中的更改。

代码语言:javascript
复制
//on new message arrived
sonoff_obj = mqtt.message;

for(json_position_index = 0; json_position_index < _arr_mqtt.length(); json_position_index++) {
    if (_arr_mqtt.getJSONObject( json_position_index ).getString( "Topic" ).equals( _received_topic )){
        _arr_mqtt.remove( json_position_index );
        _arr_mqtt.put( sonoff_obj );
        break;
    }
}

现在的问题是,因为使用.put,那么新的JsonObject总是被添加到JSONArray中的最后一个位置,而且GridView布局也被重新组织,这让最终用户感到困惑。

我正在寻找解决方案,如何更新JSONArray中的JsonObject,保持相同的索引(在数组中的位置),或者如何直接说适配器在特定位置替换项。

到目前为止,我可以使用.getItem( int index );获取适配器项内容,但是我能告诉适配器类似于(我的伪代码) .setItem( int index , JsonObject obj)中的内容吗?

EN

回答 1

Stack Overflow用户

发布于 2021-03-18 02:27:58

对于那些面临同样挑战的人来说,ArrayList是比JsonArray更好的选择,因为它支持.set方法,这是用.notifyItemChanged()方法修改ArrayList中特定位置的强大方法。如果您出于某种原因需要保留JSONArray格式(对于GridAdapter ie),您始终可以像这样将ArrayList导出为JSONArray (当然,还可以调用notifyDataSetChanged()):

代码语言:javascript
复制
my_mqtt_array = new JSONArray( my_arrayList.toString());
my_mqtt_array.notifyDataSetChanged();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66672841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档