【问题标题】:update specific item at Android GridAdapter在 Android GridAdapter 更新特定项目
【发布时间】: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) 中的内容吗?

【问题讨论】:

    标签: android json gridview


    【解决方案1】:

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

    my_mqtt_array = new JSONArray( my_arrayList.toString());
    my_mqtt_array.notifyDataSetChanged();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多