【问题标题】:Update Data in Real Time when getting from server into RecylerView从服务器进入 RecyclerView 时实时更新数据
【发布时间】:2019-02-26 09:06:02
【问题描述】:

我正在从 Websockets 获取 json 并在回收器视图中显示。从 websockets 获取数据时如何实时更新列表?

我的 WebSocket 类

 public final class EchoWebSocketListener extends WebSocketListener {
    private static final int NORMAL_CLOSURE_STATUS = 1000;
    private static final String TAG = "DashBoardScreen.this";

    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        super.onOpen(webSocket, response);

最初建立连接时,我会向服务器发送一些文本

  webSocket.send(builder.toString());
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
        super.onMessage(webSocket, text);

在返回服务器向我发送数据

 output(text);
    }

    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
        super.onMessage(webSocket, bytes);
    }

    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
        super.onClosing(webSocket, code, reason);
        Log.d(TAG, "onClosing: ");
    }

    @Override
    public void onClosed(WebSocket webSocket, int code, String reason) {
        super.onClosed(webSocket, code, reason);
        Log.d(TAG, "onClosed: ");
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t,Response response) {
        super.onFailure(webSocket, t, response);
        Log.d(TAG, "onFailure: ");
    }
}

输出方法

 private void output(final String text) {

 runOnUiThread(new Runnable() {
            @Override
            public void run() {
             *parsing json inside recyler view*

                    try {
                        JSONObject object = new JSONObject(text);
                        StringBuilder builder = new StringBuilder();
                        if (object.getBoolean("status")) {
                            JSONArray jsonArray = object.getJSONArray("events");
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject values = jsonArray.getJSONObject(i);
                                final EventsDataModel dataModel = new EventsDataModel(
                                        values.getString("service_Room_Number"),
                                        values.getString("service_Name"),
                                        values.getString("service_AssignedTo"),
                                        values.getString("service_ID")
                                );                       
                                eventsDataModels.add(dataModel);
                                adapter = new EventListAdapter(eventsDataModels, context);
                                eventRecyclerView.setAdapter(adapter);
                                adapter.notifyDataSetChanged(); 

notifyDataSetChanged() 究竟是如何工作的?

                            }
                        } else Toast.makeText(context, "No Events", Toast.LENGTH_SHORT).show();
                        System.out.println(builder.append(object.getString("status")));

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

            }
        });
    }

【问题讨论】:

标签: java android android-recyclerview java-websocket


【解决方案1】:

每当你的 dataModel 有新数据时

eventsDataModels.add(dataModel); adapter = new EventListAdapter(eventsDataModels, context); eventRecyclerView.setAdapter(adapter);

如果执行上述操作并执行adapter.notifyDataSetChanged(); 将通知适配器新数据已到达,并且必须使用新的 dataModel 更新 RecyclerView。

【讨论】:

  • 但是..为什么它在我的情况下不起作用?不显示更新列表
  • 您是否调试并看到 dataModel 中的数据正在发生变化?
  • 在for循环结束后添加这段代码 adapter = new EventListAdapter(eventsDataModels, context); eventRecyclerView.setAdapter(适配器); adapter.notifyDataSetChanged();
  • 因此,目前我的数据模型大小在从服务器获取响应时没有增加或减少,但值正在改变..数据模型是相同的。
  • 查看这里以获得指导medium.com/android-grid/…
猜你喜欢
  • 2016-11-25
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2022-06-13
相关资源
最近更新 更多