猿问

Firebase 到 ImageView - 为什么即使没有图像,我的聊天也会显示图像?

我有一个用于 Firebase 聊天的标准聊天显示方法:


private void displayChat() {


    final ListView listOfMessage = findViewById(R.id.list_of_message);

    final String DATABASE_URL = "https://firebasestorage.googleapis.com";

    Query query = FirebaseDatabase.getInstance().getReference().child("messages").child(chatName).limitToLast(20);

    FirebaseListOptions<Message> options = new FirebaseListOptions.Builder<Message>()

            .setLayout(R.layout.list_item)

            .setQuery(query, Message.class)

            .setLifecycleOwner(this)

            .build();


    FirebaseListAdapter<Message> adapter = new FirebaseListAdapter<Message>(options) {

        @Override

        protected void populateView(View v, Message model, int position) {


            //Get reference to the views of list_item.xml

            TextView messageText, messageUser, messageTime;

            ImageView img;

            messageText = v.findViewById(R.id.message_text);

            messageUser = v.findViewById(R.id.message_user);

            messageTime = v.findViewById(R.id.message_time);

            img = v.findViewById(R.id.imgView);


聊天功能齐全。但是,当涉及到图像时,我必须DATABASE_URL确定接收到的应该是图像而不是文本,因此我将其加载到 Picasso 中,如下所示:


 if (model.getMessageText().contains(DATABASE_URL)) {

                messageText.setText("Image sent: ");

                Picasso.with(getApplicationContext()).load(model.getMessageText()).into(img);

            }

但是,当它是普通文本时,我的:


else {

     messageText.setText(model.getMessageText());

}

将正常显示文本,但仍显示图像 - 始终显示最近的图像。我曾尝试添加img.setVisibility(View.INVISIBLE);到else语句中,以及从 Glide/Picasso 中进行等效删除,但它们最终都会导致每张图像都被删除而不显示。


炎炎设计
浏览 136回答 1
1回答

精慕HU

这是因为您正在重用一种布局。接下来显示的每个视图都将重用前一个视图。如果您不使布局的视图无效,则可能会发生其中一个视图包含旧数据的情况。这种布局就像一个骨架,您可以在其中固定一些元素。然后有人想重用你的骨架。他用你的东西得到它。所以他必须删除所有元素,然后他可以固定自己的东西。如果你在骨架中弯曲了一些东西,下一个人将不得不伸直,否则他将拥有带有弯曲元素的骨架(即setVisibility(INVISIBLE)->setVisibility(VISIBLE))。获得布局后,立即重置所有视图中的值。
随时随地看视频慕课网APP

相关分类

Java
我要回答