我的 RecyclerView 适配器没有通过 Volley Request 响应更新?
My RecyclerView Adapter is not respond to updates via Volley Request?
当我启动我的应用程序时,应该显示来自 ChatBot 的初始消息,但实际上没有。它以一个成功的 Volley 请求开始,并且数据在那里。
然后在响应处理程序中调用:
@Override
public void onResponse(JSONArray response) {
try {
for (int i = 0; i < response.length(); i++) {
String[] text = ((JSONObject) response.get(i)).getString("text").split("'");
chat.addChat(new ChatBubbleModel(ChatBubbleModel.UserType.BOT, text[1]));
}
} catch (Exception e) {
}
}
chat
属性 是类型 ChatModel
的 属性,它是使用观察者模式创建的,通过 RecyclerView.Adapter
自定义实现:
chat.observe(new ChatModel.Observer<ChatBubbleModel>() {
@Override
public void onChange(ChatBubbleModel data) {
chatAdapter.addBubble(data);
if (data.getUserType() == ChatBubbleModel.UserType.BOT) {
return;
}
JSONObject requestInstance = new JSONObject();
try {
requestInstance.put("text", data.getMessage());
} catch (JSONException e) {
}
CustomRequest request = new CustomRequest(Request.Method.POST, "https://url.com", requestInstance, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
for (int i = 0; i < response.length(); i++) {
String[] text = ((JSONObject) response.get(i)).getString("text").split("'");
chat.addChat(new ChatBubbleModel(ChatBubbleModel.UserType.BOT, text[1]));
}
} catch (Exception e) {
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = Maps.newHashMap();
headers.put("Content-Type", "application/json");
if (chat.getHistoryId() == null || chat.getHistoryId().isEmpty())
chat.setHistoryId(UUID.randomUUID().toString());
headers.put("historyID", chat.getHistoryId());
headers.put("userName", "");
headers.put("configurationId", "5ed0d05b95b0ba16f9690d31");
return headers;
}
};
RequestQue.getInstance().addToQueue(request);
}
});
但是如果我 f.e 扩展键盘,那么来自 Bot(聊天气泡渲染)的所有请求都会发生变化,所以我认为 RecyclerView 重新渲染会被触发,因为尺寸变化。
这是我的方法 RecyclerView.Adapter:
public void addBubble(ChatBubbleModel bubble) {
this.bubbles.add(bubble);
notifyItemChanged(bubbles.size() - 1);
}
但是如果在 Volley 网络响应之后调用它们,则不会调用
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
和 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position)
方法。只有在 KeyBoard 之后。
请使用notifyItemInserted(bubbles.size() - 1);
代替notifyItemChanged(bubbles.size() - 1);
您的 addBubble
方法如下:
public void addBubble(ChatBubbleModel bubble) {
this.bubbles.add(bubble);
notifyItemInserted(bubbles.size() - 1);
}
当我启动我的应用程序时,应该显示来自 ChatBot 的初始消息,但实际上没有。它以一个成功的 Volley 请求开始,并且数据在那里。
然后在响应处理程序中调用:
@Override
public void onResponse(JSONArray response) {
try {
for (int i = 0; i < response.length(); i++) {
String[] text = ((JSONObject) response.get(i)).getString("text").split("'");
chat.addChat(new ChatBubbleModel(ChatBubbleModel.UserType.BOT, text[1]));
}
} catch (Exception e) {
}
}
chat
属性 是类型 ChatModel
的 属性,它是使用观察者模式创建的,通过 RecyclerView.Adapter
自定义实现:
chat.observe(new ChatModel.Observer<ChatBubbleModel>() {
@Override
public void onChange(ChatBubbleModel data) {
chatAdapter.addBubble(data);
if (data.getUserType() == ChatBubbleModel.UserType.BOT) {
return;
}
JSONObject requestInstance = new JSONObject();
try {
requestInstance.put("text", data.getMessage());
} catch (JSONException e) {
}
CustomRequest request = new CustomRequest(Request.Method.POST, "https://url.com", requestInstance, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
for (int i = 0; i < response.length(); i++) {
String[] text = ((JSONObject) response.get(i)).getString("text").split("'");
chat.addChat(new ChatBubbleModel(ChatBubbleModel.UserType.BOT, text[1]));
}
} catch (Exception e) {
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = Maps.newHashMap();
headers.put("Content-Type", "application/json");
if (chat.getHistoryId() == null || chat.getHistoryId().isEmpty())
chat.setHistoryId(UUID.randomUUID().toString());
headers.put("historyID", chat.getHistoryId());
headers.put("userName", "");
headers.put("configurationId", "5ed0d05b95b0ba16f9690d31");
return headers;
}
};
RequestQue.getInstance().addToQueue(request);
}
});
但是如果我 f.e 扩展键盘,那么来自 Bot(聊天气泡渲染)的所有请求都会发生变化,所以我认为 RecyclerView 重新渲染会被触发,因为尺寸变化。
这是我的方法 RecyclerView.Adapter:
public void addBubble(ChatBubbleModel bubble) {
this.bubbles.add(bubble);
notifyItemChanged(bubbles.size() - 1);
}
但是如果在 Volley 网络响应之后调用它们,则不会调用
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
和 public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position)
方法。只有在 KeyBoard 之后。
请使用notifyItemInserted(bubbles.size() - 1);
代替notifyItemChanged(bubbles.size() - 1);
您的 addBubble
方法如下:
public void addBubble(ChatBubbleModel bubble) {
this.bubbles.add(bubble);
notifyItemInserted(bubbles.size() - 1);
}