Фрагмент не будет отображать более одного элемента - PullRequest
0 голосов
/ 10 сентября 2018

Я создал приложение для чата Android, которое включает в себя Firebase, и создал фрагмент с сообщениями текущего пользователя. Ошибка возникает, когда пользователь отправляет сообщение более чем одному человеку, и по следующей ссылке на изображение показано, как отображается первое сообщение, а последнее невидимо. Кто-нибудь знает, почему это будет? Ниже я приведу несколько своих уроков.

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

Класс фрагмента

public class ChatFragment extends Fragment {


private RecyclerView convList;
private FirebaseAuth auth;
private DatabaseReference userDatabase, messageDatabase;
private View view;

public ChatFragment() {
    // Required empty public constructor
}

// Chat Fragment initialised
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_chat, container, false);

    convList = (RecyclerView) view.findViewById(R.id.conv_list);
    convList.setHasFixedSize(true);
    convList.setLayoutManager(new LinearLayoutManager(getContext()));

    auth = FirebaseAuth.getInstance();

    String currentUser;
    currentUser = auth.getCurrentUser().getUid();

    messageDatabase = FirebaseDatabase.getInstance().getReference().child("Messages").child(currentUser);
    messageDatabase.keepSynced(true);
    userDatabase = FirebaseDatabase.getInstance().getReference().child("Users");
    userDatabase.keepSynced(true);

    return view;
}

// Use FirebaseRecyclerAdapter to populate each user of which messages have been sent between, the latest message sent between each user displayed, ordering the list by most recent message and the user's online status
@Override
public void onStart() {
    super.onStart();

    Query conversationQuery = messageDatabase.orderByChild("time");

    FirebaseRecyclerAdapter<UserConversation, ConvViewHolder> friendsRecyclerViewAdapter = new FirebaseRecyclerAdapter<UserConversation, ConvViewHolder>(

            UserConversation.class,
            R.layout.activity_user_list,
            ConvViewHolder.class,
            conversationQuery

    ) {
        @Override
        protected void populateViewHolder(final ConvViewHolder friendsViewHolder, final UserConversation friends, int i) {

            final String user_id = getRef(i).getKey();

            Query lastMessageQuery = messageDatabase.child(user_id).limitToLast(1);

            // Retrieving data stored in Firebase for each message and its information
            lastMessageQuery.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                    String data = dataSnapshot.child("message").getValue().toString();
                    ConvViewHolder.setMessage(data);

                    String time = dataSnapshot.child("time").getValue().toString();
                    ConvViewHolder.setTime(time);

                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

            userDatabase.child(user_id).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    final String userName = dataSnapshot.child("name").getValue().toString();
                    String userThumb = dataSnapshot.child("thumb_image").getValue().toString();
                    String online = dataSnapshot.child("online").getValue().toString();

                    friendsViewHolder.setName(userName);
                    friendsViewHolder.setUserImage(userThumb, getContext());
                    friendsViewHolder.setUserOnline(online);

                    friendsViewHolder.mView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            Intent intent = new Intent(getContext(), Messenger.class);
                            intent.putExtra("user_id", user_id);
                            intent.putExtra("user_name", userName);
                            try {
                                startActivity(intent);
                            }
                            catch (ActivityNotFoundException e) {
                                Log.i("Activity Not Found", "Error");
                            }
                        }
                    });
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }
    };

    convList.setAdapter(friendsRecyclerViewAdapter);

}


public static class ConvViewHolder extends RecyclerView.ViewHolder {

    static View mView;

    public ConvViewHolder(View itemView) {
        super(itemView);

        mView = itemView;

    }

    public static void setMessage(String message){

        TextView userStatusView = (TextView) mView.findViewById(R.id.user_single_status);
        userStatusView.setText(message);
    }

    public void setName(String name) {

        TextView userNameView = (TextView) mView.findViewById(R.id.user_single_name);
        userNameView.setText(name);

    }

    public void setUserImage(String thumb_image, Context ctx) {

        CircleImageView userImageView = (CircleImageView) mView.findViewById(R.id.user_single_image);
        Picasso.with(ctx).load(thumb_image).placeholder(R.drawable.default_avatar).into(userImageView);

    }

    public static void setTime (String time){
        TextView test = (TextView) mView.findViewById(R.id.time_sent);
        test.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)", Long.parseLong(time)));
    }

    public void setUserOnline(String online) {

        ImageView userOnlineView = (ImageView) mView.findViewById(R.id.user_single_online_icon);

        if(online.equals("true")){

            userOnlineView.setVisibility(View.VISIBLE);

        } else {

            userOnlineView.setVisibility(View.INVISIBLE);

        }

    }
}

1 Ответ

0 голосов
/ 10 сентября 2018

Как я вижу из вашего кода, вы используете более старую версию библиотеки Firebase-UI, в которой из-за ошибки вам явно не нужно использовать фиксированный размер.Чтобы отобразить данные в вашем RecyclerView, удалите / прокомментируйте следующую строку кода:

convList.setHasFixedSize(true);

Пожалуйста, см. здесь больше информации.

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