我有一个项目,其中带有Tasmota固件的设备正在发送MQTT JSON格式的消息,这些消息在我的项目中使用.put方法构建JSONArray。稍后,JSONArray更改被传播到调用notifyDataSetChanged()的GridView适配器。
所面临的挑战是保持JSONArray结构不变,但以不同于初始JSONArray结构的顺序到达的数据是最新的(新的MQTT消息到达)。其结果是JSONArray embedded JSONObjects的顺序会动态改变,gridView的顺序也会改变,这会让用户感到困惑。在时间上,我试图通过以下方式解决这个问题:从从JSONArray发送更新的设备中删除最新的JSON消息,方法是调用.remove并重新添加更新的Json对象,调用.put方法+调用notifyDataSetChanged()以反映GridView中的更改。
//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)中的内容吗?
发布于 2021-03-18 02:27:58
对于那些面临同样挑战的人来说,ArrayList是比JsonArray更好的选择,因为它支持.set方法,这是用.notifyItemChanged()方法修改ArrayList中特定位置的强大方法。如果您出于某种原因需要保留JSONArray格式(对于GridAdapter ie),您始终可以像这样将ArrayList导出为JSONArray (当然,还可以调用notifyDataSetChanged()):
my_mqtt_array = new JSONArray( my_arrayList.toString());
my_mqtt_array.notifyDataSetChanged();https://stackoverflow.com/questions/66672841
复制相似问题