在我的自定義adadpter(RequestAdapter)中,我動態地刪除了元素。我通過從通過構造函數傳遞的對象的ArrayList中刪除對象來完成此操作。一旦我在列表中使用remove(),我調用notifyDataSetChanged()。如何通過自定義適配器刪除一個元素後,刷新listView?
問題是這樣的 - 從原始列表中刪除項目,但除了已刪除項目以外的所有項目都被添加到listView中。 (如果我從列表[ABC]中刪除A,最後的結果是一個看起來像這樣的列表 - [BCBC]。此外,如果我從這個列表中刪除B,我得到這個 - [CBCC]
這裏是代碼我使用:?
private HashMap<String,Object> tournamentStatus = new HashMap<>();
public RequestAdapter(Activity context, ArrayList<RequestDetails> requests){
super(context,0,requests);
this.mRequestsList = requests;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Log.d("Adapter getView()","Invoked");
View listItemView = convertView;
if(listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.request_list_item, parent, false);
}
final RequestDetails retrievedRequest = getItem(position);
final boolean isOCRequest;
final boolean isParticipantRequest;
final TextView tournamentName = (TextView) listItemView.findViewById(R.id.request_textview_tournament_name);
final TextView userName = (TextView) listItemView.findViewById(R.id.request_textview_user_name);
final TextView requestType = (TextView) listItemView.findViewById(R.id.request_textview_request_type);
final TextView sport = (TextView) listItemView.findViewById(R.id.request_textview_sport);
final TextView userFaculty = (TextView) listItemView.findViewById(R.id.request_textview_user_faculty);
final TextView userYear = (TextView) listItemView.findViewById(R.id.request_textview_user_year);
if(retrievedRequest.isParticipantRequest()) {
requestType.setText("Request Type: Participant");
sport.setText("Sport: "+retrievedRequest.getSport());
}
else {
requestType.setText("Request Type: Organizing Committee");
sport.setVisibility(View.GONE);
}
tournamentRef = FirebaseDatabase.getInstance().getReference().child("Tournaments").child(retrievedRequest.getTournamentId());
tournamentRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
TournamentInformation tournamentInformation = dataSnapshot.getValue(TournamentInformation.class);
tournamentName.setText(tournamentInformation.getTournamentName());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
userRef = FirebaseDatabase.getInstance().getReference().child("Users").child(retrievedRequest.getUserId());
userRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
UserInformation user = dataSnapshot.getValue(UserInformation.class);
userName.setText("User Name: "+user.getName());
userFaculty.setText("Faculty: "+user.getFaculty());
userYear.setText("Year: "+Integer.toString(user.getYear()));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Button mAcceptButton = (Button) listItemView.findViewById(R.id.accept_request_button);
Button mDenyButton = (Button) listItemView.findViewById(R.id.deny_request_button);
mAcceptButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(retrievedRequest.isParticipantRequest()){
tournamentStatus.put("isOrganizing",false);
tournamentStatus.put("isParticipating",true);
userRef.child("sports").child(retrievedRequest.getTournamentId()).child(retrievedRequest.getSport()).setValue(true);
}
else if(retrievedRequest.isOCRequest()){
tournamentStatus.put("isOrganizing",true);
tournamentStatus.put("isParticipating",false);
}
Toast.makeText(getContext(),"Requested Accepted",Toast.LENGTH_SHORT).show();
userRef.child("tournamentStatuses").child(retrievedRequest.getTournamentId()).updateChildren(tournamentStatus);
DatabaseReference requestsRef = FirebaseDatabase.getInstance().getReference().child("Requests");
requestsRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for(DataSnapshot requestLooper : dataSnapshot.getChildren()){
RequestDetails loopedRequest = requestLooper.getValue(RequestDetails.class);
if(loopedRequest.equals(retrievedRequest)){
requestLooper.getRef().removeValue();
Log.d("Removing at",requestLooper.getRef().toString());
Log.d("requestList",mRequestsList.toString());
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
mRequestsList.remove(retrievedRequest);
notifyDataSetChanged();
}
});
mDenyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatabaseReference requestsRef = FirebaseDatabase.getInstance().getReference().child("Requests");
requestsRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for(DataSnapshot requestLooper : dataSnapshot.getChildren()){
RequestDetails requestDetails = requestLooper.getValue(RequestDetails.class);
if(requestDetails.equals(retrievedRequest)){
requestLooper.getRef().removeValue();
Log.d("Removing at",requestLooper.getRef().toString());
Log.d("requestList",mRequestsList.toString());
Toast.makeText(getContext(),"Requested Denied",Toast.LENGTH_SHORT).show();
break;
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
mRequestsList.remove(retrievedRequest);
notifyDataSetChanged();
}
});
return listItemView;
}
做什麼樣的變化我做這樣的名單不重複
UPDATE我加了整個適配器代碼,但大部分與設置textViews涉及我只在Accept和Deny按鈕的clickListeners中執行刪除操作
我想這個問題會出現在代碼的其他部分。你能顯示完整的自定義適配器代碼? –
@ josef.adamcik添加了代碼 –
您正在將ArrayList作爲構造函數參數傳遞給適配器。它是從哪裏來的?我想這可能是列表中的數據在某處某處複製的。此外,我認爲你沒有正確使用firebase - 在getView方法中執行異步查詢會導致問題。 (但我自己並沒有使用firebase,所以我不知道細節)嘗試查詢所有數據,將它們準備到列表中,然後只顯示它們。 getView方法應該只包含:a)未提供循環視圖時佈局膨脹,b)將項目中的數據映射到視圖。 –