RecyclerView:添加的项目未显示

时间:2016-06-16 11:26:09

标签: android json android-recyclerview java-websocket

添加到recyclerView的项目直到用户滚动才显示。我正在使用websockets进行通信。当服务器上的用户发送消息时,服务器返回我要解析为模型的json,然后将其添加到recyclerview适配器。项目已添加到recyclerview,但在我向上或向下滚动recyclerview之前它没有显示。我做了一个测试,在那里我添加了带有测试Json的静态字符串,当我点击一个按钮时,它将触发相同的方法,但是在websocket外面有测试数据,它会在recyclerview之上添加项目。

使用此方法添加的项目在用户滚动之前不会显示:

WebSocket ws = factory.createSocket("wss://example.com/websocket");
ws.addListener(new WebSocketAdapter() {
            @Override
            public void onTextMessage(WebSocket websocket, String text) throws Exception {
                adapter.add(parseWs(text);
            }
});

private Discussion parseWs(String string) {
    discussion = new JSONObject(string).getJSONObject("data").toString();
    Gson gson = new Gson();
    return gson.fromJson(discussion, Discussion.class);
}

////////////Adapter class////////////
public void add(Discussion disc) {
    list.add(0,disc);
    notifyItemInserted(0);
}

如果我从点击按钮添加项目,则项目正常显示而不滚动:

fab.setOnClickListener(v -> 
    adapter.add(parseWs(test));
    mRecyclerView.scrollToPosition(0);
);

我正在使用nv-weboskcet-client java库。

1 个答案:

答案 0 :(得分:0)

不确定你想要什么,但尝试使用

notifyDataSetChanged();

这可以解决你的问题。

如果调用是异步的,您必须使用处理程序类来更新视图。

Android和JavaRx:

https://mttkay.github.io/blog/2013/08/25/functional-reactive-programming-on-android-with-rxjava/

但是只需使用Handler类进行尝试。

Handler handler = new Handler();
ws.addListener(new WebSocketAdapter() {
    @Override
    public void onTextMessage(WebSocket websocket, String text) throws Exception {
        handler.post(new Runnable(){
            adapter.add(parseWs(text);
        });
    }
});

这样的事情应该有效:)

您是否必须将处理程序处理程序声明为您的活动中的字段。