Android Firebase onChildChanged для пользовательских адаптеров - PullRequest
0 голосов
/ 01 февраля 2019

Выполняя приложение 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: я знаю, что не имеет смысла обновлять сообщение в приложении чата, это было просто совпадение, чтобы быть в этом случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...