[SOLVED]Android Studio--ListView没有按照正确的顺序显示,并产生重复。

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

我试图做一个聊天活动与两个人.我使用firebase和我有一个问题,当我提出的数据从它的列表视图与适配器,我使用.所有的数据是正确保存在firebase,但当我把它添加到列表视图,它显示重复的模拟器,并在错误的顺序也提出它。

谢谢你的回答,Tamir

public class chatActivity extends AppCompatActivity {
private EditText editText;
private FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
private DatabaseReference mRef;
private MessageAdapter messageAdapter;
private ListView messagesView;
private String userNameLoggedIn,userSelected;
public MemberData data;
public String selctedKey;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);
    mRef = mDatabase.getReference().child("messages");
    editText = (EditText) findViewById(R.id.editText);
    userNameLoggedIn = getIntent().getStringExtra("userNameLoggedIn");
    userSelected = getIntent().getStringExtra("userSelected");
    messageAdapter = new MessageAdapter(this);
    messagesView = (ListView) findViewById(R.id.messages_view);
    messagesView.setAdapter(messageAdapter);

    data = new MemberData(userSelected, getRandomColor());

    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Map<String, Object> messageTable = (HashMap<String, Object>) dataSnapshot.getValue();
            for (String key : messageTable.keySet()) {
                Map<String, Object> value = (HashMap<String, Object>) messageTable.get(key);
                if (value.get("user1").toString().equals(userNameLoggedIn)||value.get("user2").toString().equals(userNameLoggedIn)) {
                    selctedKey = key;
                    Map<String, Object> messageList = (HashMap<String, Object>) value.get("messageList");
                    for (String key2 : messageList.keySet()) {
                        Map<String, Object> value2 = (HashMap<String, Object>) messageList.get(key2);

                        if (value2.get("sender").equals(userNameLoggedIn)) {
                            onMessage(value2.get("text").toString(),true);
                        }
                        else onMessage(value2.get("text").toString(),false);
                    }
                }
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}




@RequiresApi(api = Build.VERSION_CODES.O)
public void sendMessage(View view){
    final String msg = editText.getText().toString();
    if (msg.length() > 0) {
        editText.getText().clear();
    }
    onMessage(msg,true);
    final Map<String, String> userData = new HashMap<String, String>();
    String time = LocalDateTime.now().toString();
    userData.put("sender",userNameLoggedIn);
    userData.put("text",msg);
    userData.put("timeStamp",time);
    String key = mRef.push().getKey();
    DatabaseReference refChildKey = mRef.child(selctedKey).child("messageList").child(key);
    refChildKey.setValue(userData);
    messageAdapter.notifyDataSetChanged();


}
public void onMessage(final String msg, final boolean belg){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {

            Message message = new Message(msg,data,belg);
            messageAdapter.add(message);
            // scroll the ListView to the last added element
            messagesView.setSelection(messagesView.getCount() - 1);
        }
    });
}

private String getRandomColor() {
    Random r = new Random();
    StringBuffer sb = new StringBuffer("#");
    while(sb.length() < 7){
        sb.append(Integer.toHexString(r.nextInt()));
    }
    return sb.toString().substring(0, 7);
}
}

class MemberData {
private String name;
private String color;

public MemberData(String name, String color) {
    this.name = name;
    this.color = color;
}

public MemberData() {
}

public String getName() {
    return name;
}

public String getColor() {
    return color;
}

@Override
public String toString() {
    return "MemberData{" +
            "name='" + name + '\'' +
            ", color='" + color + '\'' +
            '}';
}
}
java android firebase listview chat
1个回答
1
投票

我认为这可能是由HashMap引起的,因为它不能确保插入顺序。也许最好尝试使用LinkedHashMap。


0
投票

尝试使用RecyclerView而不是ListView


0
投票

我把Value Event Listener改成Child Event Listener就解决了,谢谢大家。

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