带有firebase的聊天应用程序中的RecyclerView不会显示项目,即使存在带有项目的数组

问题描述 投票:0回答:1

我正在使用android聊天应用程序。我正在使用Java和Firebase。我正在尝试将消息设置为recyclerView,但是即使消息数组中有项目也不会出现。

我已经尝试过Firebase的适配器,现在我做了自己的适配器。我创建了在创建时将可见的消息视图。 Firebase的数据库还具有所有提供的数据。

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private RecyclerView messageRecycler;
    private ChatRecyclerAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        messageRecycler = findViewById(R.id.message_recycler);
        messageRecycler.setHasFixedSize(true);
        messageRecycler.setLayoutManager(new LinearLayoutManager(this));

        FirebaseDatabase database = FirebaseDatabase.getInstance();
        final DatabaseReference ref = database.getReference("chats");
        ref.setValue("");
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                ArrayList<Message> messages = new ArrayList<>();
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    Message m = ds.getValue(Message.class);
                    messages.add(m);
                }
                Log.d(TAG, "onDataChange: MESS C = " + messages.size());
                adapter = new ChatRecyclerAdapter(MainActivity.this, messages);
                messageRecycler.setAdapter(adapter);
                messageRecycler.setLayoutManager(new LinearLayoutManager(MainActivity.this));
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, "onCancelled: WQHAT?!");
            }
        });

        Button sendButton = findViewById(R.id.send_button);
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FirebaseAuth.getInstance().getCurrentUser();
                EditText sendInput = findViewById(R.id.send_input);
                ref.push().setValue(
                        new Message(sendInput.getText().toString(),
                            FirebaseAuth.getInstance().getCurrentUser()));

                sendInput.setText("");
            }
        });
    }
}

如果需要,还有一个适配器代码

public class ChatRecyclerAdapter extends RecyclerView.Adapter<ChatRecyclerAdapter.ChatViewHolder> {
    private static final String TAG = "ChatRecyclerAdapter";

    Context mContext;
    ArrayList<Message> mDataSet;

    public ChatRecyclerAdapter(Context context, ArrayList<Message> dataSet) {
        mContext = context;
        mDataSet = dataSet;
    }

    @NonNull
    @Override
    public ChatViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Log.d(TAG, "onCreateViewHolder: CREASTEEED.");
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.message_view, parent, false);
        return new ChatViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ChatViewHolder holder, int position) {
        holder.bind(mDataSet.get(position));
    }

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

    class ChatViewHolder extends RecyclerView.ViewHolder {

        ImageView profileImage;
        TextView usernameText, contentText;

        ChatViewHolder(@NonNull View itemView) {
            super(itemView);
            profileImage = itemView.findViewById(R.id.profile_image);
            usernameText = itemView.findViewById(R.id.user_name_text);
            contentText = itemView.findViewById(R.id.content_text);
        }

        void bind(Message message) {
            usernameText.setText(message.getUser().getDisplayName());
            contentText.setText(message.getContent());
        }
    }
}

[当我发送消息时,来自'onDataChange'的日志,但是没有'onCreateViewHolder'的日志。

java android android-recyclerview recycler-adapter
1个回答
0
投票

添加消息后,需要调用adapter.notifyDataSetChanged()

© www.soinside.com 2019 - 2024. All rights reserved.