尽管清除,ListView 总是有重复项

ListView always has duplicates despite clears

我有以下 activity:

public class EventGuestListForHostActivity extends AppCompatActivity {

    private ListView guestsListView;

    private ArrayList<Guest> guestsArrayList;

    private DatabaseReference dbReferenceEvent;

    private GuestListGuestNameAdapter guestListAdapter;

    private String eventId;
    private String guestKey;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d("HMMM", "test");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_guest_list_for_host);

        guestsListView = (ListView) findViewById(R.id.guestListView);

        guestsArrayList = new ArrayList<>();

        dbReferenceEvent = FirebaseDatabase.getInstance()
                .getReference("Event");

        guestListAdapter = new GuestListGuestNameAdapter(this, R.layout.guest_list_adapter, guestsArrayList);
        guestsListView.setAdapter(guestListAdapter);

        eventId = getIntent().getExtras().getString("event_id");

        guestsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                Guest g = (Guest) adapterView.getItemAtPosition(i);

                Intent intent = new Intent(EventGuestListForHostActivity.this, HostApproveAndDeny.class);
                intent.putExtra("guest_id", g.userId);
                intent.putExtra("member_id", g.memberId);
                intent.putExtra("event_id", eventId);
                intent.putExtra("guest_key", g.guestKey);
                intent.putExtra("approval_status", g.approvalStatus);
                intent.putExtra("guest_name", g.name);

                startActivity(intent);
            }
        });

        guestsArrayList.clear();
        guestListAdapter.clear();
        guestListAdapter.notifyDataSetChanged();
        getData();
    }

    public void getData() {
        guestsArrayList.clear();
        guestListAdapter.clear();
        guestListAdapter.notifyDataSetChanged();
        dbReferenceEvent.child(eventId).child("guestList").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                Guest guest = snapshot.getValue(Guest.class);
                guest.guestKey = snapshot.getKey();
                guestsArrayList.add(guest);
                guestListAdapter.notifyDataSetChanged();
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        guestsArrayList.clear();
        guestListAdapter.clear();
        guestListAdapter.notifyDataSetChanged();

        guestsListView.setAdapter(null);
        guestListAdapter = null;

        guestListAdapter = new GuestListGuestNameAdapter(this, R.layout.guest_list_adapter, guestsArrayList);
        guestsListView.setAdapter(guestListAdapter);
        
        getData();

    }

当用户 returns 通过按 android 后退按钮进入此 activity 时,我希望重新填充 ListView (因为来自 Firebase 的一些数据可能有改变了)。使用当前代码,我的 ListView 始终包含每个元素的重复项,事件是 activity 首次启动时的事件。我不确定为什么我使用的大量清除不能阻止这种情况的发生。感谢任何帮助或指点。

您不需要在 onCreate 中调用 getData 因为 onResume 会被调用无论如何,即使您是第一次进入Activity/Fragment。因此,您可以从 onCreate 中删除调用。这就是为什么你甚至第一次就有重复的原因。