【发布时间】:2021-03-17 12:09:18
【问题描述】:
我有一个项目,其中带有 Tasmota 固件的设备正在发送 MQTT JSON 格式的消息,这些消息在我的项目中使用.put 方法构建 JSONArray。稍后 JSONArray 更改会传播到调用 notifyDataSetChanged() 的 GridView 适配器。
挑战在于保持 JSONArray 结构相同,但使用最新的(新 MQTT 消息到达)数据,这些数据的到达顺序与初始 JSONArray 结构不同。结果是 JSONArray 嵌入的 JSONObjects 顺序会即时更改,而 gridView 的顺序也会更改,这让用户感到困惑。暂时我尝试通过调用.remove 并重新添加更新的Json 对象调用.put 方法+ 调用notifyDataSetChanged() 来反映GridView 中的更改,从设备中删除最新的JSON 消息来解决这个问题。
//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 保持相同的索引(数组中的位置)或如何直接说适配器以替换特定位置的 Item。
到目前为止,我可以使用 .getItem( int index ); 获取适配器项目内容,但我可以告诉适配器类似(我的伪代码).setItem( int index , JsonObject obj) 中的内容吗?
【问题讨论】: