尽管清除,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 中删除调用。这就是为什么你甚至第一次就有重复的原因。
我有以下 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 中删除调用。这就是为什么你甚至第一次就有重复的原因。