添加到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库。
答案 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);
});
}
});
这样的事情应该有效:)
您是否必须将处理程序处理程序声明为您的活动中的字段。