RecyclerView for group chat活动未显示在Android Studio中的FirebaseUI中

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

我正在尝试在Android中创建一个聊天消息传递工具,在完成一些教程后,代码无效。

我已经尝试过改变数据库的读取方式,以及它的布局。

我从这里https://medium.com/android-grid/how-to-use-firebaserecycleradpater-with-latest-firebase-dependencies-in-android-aff7a33adb8b跟随这个教程

public class Chat extends AppCompatActivity {

    RecyclerView listOfMessages;
    FirebaseRecyclerAdapter adapter;
    LinearLayoutManager linearLayoutManager;
    FirebaseRecyclerOptions<ChatMessage> options;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EditText input = (EditText)findViewById(R.id.input);

                DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Chat").push();
                //add messageText, messageTime, messageUser as a hash map to the database
                Map<String, Object> map = new HashMap<>();
                map.put("Body", input.getText().toString());
                map.put("Username", FirebaseAuth.getInstance().getCurrentUser().getEmail());
                map.put("Post time", new Date().getTime());
                reference.setValue(map);
                input.setText("");
            }
        });
        linearLayoutManager = new LinearLayoutManager(this);
        listOfMessages.setLayoutManager(linearLayoutManager);
        listOfMessages.setHasFixedSize(true);
        fetch();
    }

    private void fetch() {
        Log.v("TAG", "in fetch");
        Query query = FirebaseDatabase.getInstance().getReference().child("Chats");

        Log.v("TAG", query.toString());

        //FirebaseRecyclerAdapter binds query to a RecycleView.  When data is added, removed or changed these updates are automatically applied to UI in real time.
        options = new FirebaseRecyclerOptions.Builder<ChatMessage>()
                .setLifecycleOwner(this)
                .setQuery(query, new SnapshotParser<ChatMessage>(){
                @NonNull
                @Override
                public ChatMessage parseSnapshot(@NonNull DataSnapshot snapshot) { //Needed to customize how ChatMessage class is parsed
                    Log.v("TAG", "in parseSnapshot");
                    return new ChatMessage(snapshot.child("Body").getValue().toString(), snapshot.child("Username").getValue().toString());
                }
            }).build();

        Log.v("TAG", options.toString());

        //Uses a ViewHolder to display each item
        adapter = new FirebaseRecyclerAdapter<ChatMessage, ViewHolder>(options) {

            @NonNull
            @Override
            public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
                //Create a new instance of ViewHolder, uses R.layout.message for each item
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message, viewGroup, false);
                Log.v("TAG", "in onCreateViewHolder");
                return new ViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(ViewHolder holder, final int position, ChatMessage model) {
                Log.v("TAG", "in onBindViewHolder");
                holder.setMessageText(model.getMessageText());
                holder.setMessageUser(model.getMessageUser());
            }
        };
        listOfMessages.setAdapter(adapter);
    }
```
    public class ViewHolder extends RecyclerView.ViewHolder{
        public TextView messageText;
        public TextView messageUser;
        public TextView messageTime;

        public ViewHolder(View itemView){
            super(itemView);
            messageText = itemView.findViewById(R.id.message_text);
            messageUser = itemView.findViewById(R.id.message_user);
            messageTime = itemView.findViewById(R.id.message_time);
        }

        public void setMessageText(String text) {
            messageText.setText(text);
        }

        public void setMessageUser(String user) {
            messageUser.setText(user);
        }

        public void setMessageTime(TextView messageTime) {
            this.messageTime = messageTime;
        }
    }
}

应该调用重写的方法,并将日志语句写入控制台。但是,它们不会出现,并且注释不会显示在XML中的“回收视图”中。

android firebase android-recyclerview override chat
1个回答
0
投票

您需要使用startListening()方法来显示数据。

来自文档:

FirebaseRecyclerAdapter使用事件监听器来监控Firebase查询的更改。要开始侦听数据,请调用startListening()方法。您可能想在onStart()方法中调用它。在调用startListening()之前,请确保已完成读取数据所需的任何身份验证,否则您的查询将失败。

  @Override
protected void onStart() {
  super.onStart();
  adapter.startListening();
 }

同样,stopListening()调用会删除事件侦听器和适配器中的所有数据。当包含Activity或Fragment停止时调用此方法:

 @Override
protected void onStop() {
 super.onStop();
 adapter.stopListening();
}

参考:

https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md

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