0
votes

[RESOLU] Android Studio - ListView ne présente pas dans le bon ordre et faire des doublons

im essayant de faire une activité de discussion avec deux personnes. Je suis en train d'utiliser FireBase et j'ai un problème lorsque je présente les données à la liste de réception avec l'adaptateur que je utilise. Toutes les données économisent correctement dans la Firebase, mais lorsque je l'ajoute à la listeView, il affiche des duplicats dans l'émulateur et présentez-le dans le mauvais ordre.

Merci pour vos réponses, Tamir p>

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 + '\'' +
            '}';
}
}


0 commentaires

3 Réponses :


1
votes

Je pense que cela peut être causé par hashmap car il ne garantit pas l'ordre d'insertion. Peut-être mieux essayer d'utiliser LinkedHashMap.


1 commentaires

Cela ne fonctionne pas car la Firebase ne peut pas lancer les données sur LinkedAndMap .: /



0
votes

Essayez d'utiliser RECYCLERVIEW au lieu de ListView


1 commentaires

J'essaie d'utiliser RecyclERView, mais je ne sais pas comment utiliser mon adaptateur personnalisé.



0
votes

Je l'ai résolu en modifiant l'écouteur d'événement de valeur dans l'auditeur d'événement enfant. Merci tous


0 commentaires