Выполняя приложение Message из Firebase в выходные дни: Android , я хотел обновить MessageAdapter
с помощью ChildEventListener.Для add
и remove
с использованием onChildAdded
и onChildRemoved
я не обнаружил никаких проблем, но когда я пытался обновить на onChildChanged
, ничего не получилось.Сначала измененный ребенок был добавлен во второй раз, а не обновлен.Их добавили в конец списка, нет по его индексу.Наконец, я сделал это, используя вспомогательный ArrayList
, просто чтобы узнать индекс измененного потомка, удалить его из mFriendlyMessagesList
и затем добавить новое содержимое в старый индекс.
FriendlyMessage.java
/**
* Copyright Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.firebase.udacity.friendlychat;
public class FriendlyMessage {
private String text;
private String name;
private String photoUrl;
public FriendlyMessage() {
}
public FriendlyMessage(String text, String name, String photoUrl) {
this.text = text;
this.name = name;
this.photoUrl = photoUrl;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhotoUrl() {
return photoUrl;
}
public void setPhotoUrl(String photoUrl) {
this.photoUrl = photoUrl;
}
}
MessageAdapter.java
public class MessageAdapter extends ArrayAdapter<FriendlyMessage> {
public MessageAdapter(Context context, int resource, List<FriendlyMessage> objects) {
super(context, resource, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message, parent, false);
}
ImageView photoImageView = (ImageView) convertView.findViewById(R.id.photoImageView);
TextView messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
TextView authorTextView = (TextView) convertView.findViewById(R.id.nameTextView);
FriendlyMessage message = getItem(position);
boolean isPhoto = message.getPhotoUrl() != null;
if (isPhoto) {
messageTextView.setVisibility(View.GONE);
photoImageView.setVisibility(View.VISIBLE);
Glide.with(photoImageView.getContext())
.load(message.getPhotoUrl())
.into(photoImageView);
} else {
messageTextView.setVisibility(View.VISIBLE);
photoImageView.setVisibility(View.GONE);
messageTextView.setText(message.getText());
}
authorTextView.setText(message.getName());
return convertView;
}
}
ChildEventListener
mFriendlyMessagesList = new ArrayList<>();
mMessageAdapter = new MessageAdapter(this, R.layout.item_message,
mFriendlyMessagesList);
mMessageListView.setAdapter(mMessageAdapter);
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
FriendlyMessage friendlyMessage = dataSnapshot.getValue(FriendlyMessage.class);
mFriendlyMessagesList.add(friendlyMessage);
mKeys.add(dataSnapshot.getKey());
}
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
String key = dataSnapshot.getKey();
int index = mKeys.indexOf(key);
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
mFriendlyMessagesList.remove(index);
Toast.makeText(getApplicationContext(), " " + index, Toast.LENGTH_SHORT).show();
FriendlyMessage friendlyMessage = dataSnapshot.getValue(FriendlyMessage.class);
mFriendlyMessagesList.add(index, friendlyMessage);
mMessageAdapter.notifyDataSetChanged();
}
Как видите, мой mKeys
является вспомогательным ArrayList, и я добавляю к нему каждый дочерний ключ (onChildAdded).Когда что-то меняется, я получаю дочерний индекс из mKeys
, удаляю из mFriendlyMessagesList
и добавляю его обратно в адаптер.
Я занимался этим несколько дней и не нашел ни одногохороший ответЭто работает точно так, как ожидалось, но я не думаю, что это лучший способ сделать.Ребята, не могли бы вы сказать, если это лучший способ справиться с этим?Для меня это просто быстрое решение, а не правильный путь.
Ps: я знаю, что не имеет смысла обновлять сообщение в приложении чата, это было просто совпадение, чтобы быть в этом случае