Изменение пользовательского интерфейса в методе onComplete OnCompleteListener для задачи - PullRequest
0 голосов
/ 13 января 2019

Я использую базу данных Cloud Firestore для заполнения RecyclerView в приложении для Android. Я получаю данные с помощью Задачи в методе OnAttach фрагмента. Мне нужно иметь возможность обновлять пользовательский интерфейс, RecyclerView, используя данные из облачного хранилища пожаров.

Я заполнил RecyclerView фиктивными данными в методе onAttach фрагмента, и это сработало, но когда я поставил тот же цикл, который вставляет фиктивные данные в метод onComplete объекта OnCompleteListener, который используется в задаче, которая извлекает данные из облака Firestore, RecyclerView не обновляется, и список остается пустым. Мне нужно сделать это, чтобы в конечном итоге вставить данные из облачного хранилища пожаров.

Внутри фрагмента. Данные, возвращаемые из базы данных Firestore, верны, и я вижу все операторы Log в методе onComplete в Logcat.

ChatListFragment:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments() != null) {
        mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_chat_list, container, false);

    // Set the adapter
    if (view instanceof RecyclerView) {
        Context context = view.getContext();
        RecyclerView recyclerView = (RecyclerView) view;
        if (mColumnCount <= 1) {
            recyclerView.setLayoutManager(new LinearLayoutManager(context));
        } else {
            recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
        }
        chatRecyclerViewAdapter = new ChatRecyclerViewAdapter(ChatList.ITEMS, mListener);
        recyclerView.setAdapter(chatRecyclerViewAdapter);
    }
    return view;
}

...

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnListFragmentInteractionListener) {
        mListener = (OnListFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnListFragmentInteractionListener");
    }

    Log.d(LOG_TAG, "activity attached, creating Firestore instance");

    FirebaseFirestore db = FirebaseFirestore.getInstance();

    //Worked, but doesn't in OnCompleteListener
    /*for (int i = 1; i <= 10; i++) {
        ChatList.addItem(ChatList.createDummyItem(i));
    }*/

    Task<QuerySnapshot> task = db.collection("chats").get();
    task.addOnCompleteListener(getActivity(), new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (QueryDocumentSnapshot document : task.getResult()) {
                    Log.d(LOG_TAG, "ID = " + document.getId() + " => " + document.getData());
                    ChatListMessage chatListMessage = document.toObject(ChatListMessage.class);

                    for (int i = 1; i <= 10; i++) {
                        Log.d(LOG_TAG, "adding message");
                        ChatList.addItem(ChatList.createDummyItem(i));
                    }
                    Log.d(LOG_TAG, "ChatListMessage members " + chatListMessage.getLastMessage());
                }
            } else {
                Log.w(LOG_TAG, "Error getting documents.", task.getException());
            }
        }
    });
}

В классе ChatList

public static void addItem(ChatListItem item) {
    ITEMS.add(item);
    ITEM_MAP.put(item.userId, item);
}

public static ChatListItem createDummyItem(int position) {
    return new ChatListItem(String.valueOf(position), R.drawable.profile_circle, makeDetails(position),
                    new Timestamp(System.currentTimeMillis()));
}

public static class ChatListItem {
    public final String userId;
    public final int pictureUrl;
    public final String lastMessage;
    public final Timestamp timeStamp;

    public ChatListItem(String userId, int pictureUrl, String details, Timestamp timeStamp) {
        this.userId = userId;
        this.pictureUrl = pictureUrl;
        this.lastMessage = details;
        this.timeStamp = timeStamp;
    }

    @Override
    public String toString() {
        return userId;
    }

    public Timestamp getTimeStamp() {
        return timeStamp;
    }

    public String getTLastMessage() {
        return lastMessage;
    }
}

Пользовательский RecyclerViewAdapter

public class ChatRecyclerViewAdapter extends RecyclerView.Adapter<ChatRecyclerViewAdapter.ViewHolder> {

    private final List<ChatListItem> mValues;
    private final OnListFragmentInteractionListener mListener;

    public ChatRecyclerViewAdapter(List<ChatListItem> items, OnListFragmentInteractionListener listener) {
        mValues = items;
        mListener = listener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.fragment_chat, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.mItem = mValues.get(position);
        holder.contactImageView.setImageResource(mValues.get(position).pictureUrl);
        holder.contactImageView.setScaleType(ImageView.ScaleType.FIT_XY);
        holder.mContentView.setText(mValues.get(position).lastMessage);

        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != mListener) {
                    // Notify the active callbacks interface (the activity, if the
                    // fragment is attached to one) that an item has been selected.
                    mListener.onListFragmentInteraction(holder.mItem);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return mValues.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public final View mView;
        public final ImageView contactImageView;
        public final TextView messageMembersTextView;
        public final TextView mContentView;
        public final TextView timestampView;
        public ChatListItem mItem;

        public ViewHolder(View view) {
            super(view);
            mView = view;
            messageMembersTextView = view.findViewById(R.id.message_members);
            contactImageView = view.findViewById(R.id.contact_imageView);
            mContentView = view.findViewById(R.id.content_textView);
            timestampView = view.findViewById(R.id.timestamp_textView);
        }

        @Override
        public String toString() {
            return super.toString() + " '" + mContentView.getText() + "'";
        }
    }
}

Как я могу получить обновление интерфейса с помощью метода onComplete OnCompleteListener?

1 Ответ

0 голосов
/ 14 января 2019

Для этого необходимо вызвать chatRecyclerViewAdapter.notifyDataSetChanged () в методе onComplete объекта OnCompleteListener. Я забыл сделать это вне слушателя, так как похоже, что элементы списка извлекаются после вызова метода onAttach.

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