我有一个用于 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 中进行等效删除,但它们最终都会导致每张图像都被删除而不显示。
1 回答
精慕HU
TA贡献1845条经验 获得超8个赞
这是因为您正在重用一种布局。接下来显示的每个视图都将重用前一个视图。如果您不使布局的视图无效,则可能会发生其中一个视图包含旧数据的情况。
这种布局就像一个骨架,您可以在其中固定一些元素。然后有人想重用你的骨架。他用你的东西得到它。所以他必须删除所有元素,然后他可以固定自己的东西。如果你在骨架中弯曲了一些东西,下一个人将不得不伸直,否则他将拥有带有弯曲元素的骨架(即setVisibility(INVISIBLE)->setVisibility(VISIBLE)
)。
获得布局后,立即重置所有视图中的值。
添加回答
举报
0/150
提交
取消