[Решено] Android Studio - ListView не отображается в правильном порядке и дублирует - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь поговорить с двумя людьми. Я использую firebase, и у меня проблема, когда я представляю данные из нее в список с адаптером, который я использую. все данные правильно сохраняются в firebase, но когда я добавляю их в список, он показывает дубликаты в эмуляторе, а также представляет их в неправильном порядке.

спасибо за ваши ответы, Тамир

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

Ответы [ 3 ]

1 голос
/ 05 мая 2020

Я думаю, это может быть вызвано HashMap, потому что он не обеспечивает порядок вставки. Может лучше попробовать использовать LinkedHashMap.

0 голосов
/ 11 мая 2020

Я решил это, изменив прослушиватель событий значения на прослушиватель дочерних событий. Всем спасибо

0 голосов
/ 05 мая 2020

Попробуйте использовать RecyclerView вместо ListView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...