2017-06-20 75 views
1

在我的自定義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中執行刪除操作

+0

我想這個問題會出現在代碼的其他部分。你能顯示完整的自定義適配器代碼? –

+0

@ josef.adamcik添加了代碼 –

+0

您正在將ArrayList作爲構造函數參數傳遞給適配器。它是從哪裏來的?我想這可能是列表中的數據在某處某處複製的。此外,我認爲你沒有正確使用firebase - 在getView方法中執行異步查詢會導致問題。 (但我自己並沒有使用firebase,所以我不知道細節)嘗試查詢所有數據,將它們準備到列表中,然後只顯示它們。 getView方法應該只包含:a)未提供循環視圖時佈局膨脹,b)將項目中的數據映射到視圖。 –

回答

0

如果你不想在集合重複,

List<String> al = new ArrayList<>(); 

//包括重複列表

private void removeDuplicate(ArrayList al) 
{ 
    HashSet<String> hs = new HashSet<>(); 
    hs.addAll(al); 
    al.clear(); 
    al.addAll(hs); 
} 

//更改添加列表中刪除後調用此方法

removeDuplicate(人);

+0

對不起,你能解釋一下嗎? hashSet的目的是什麼? @ Buvan V –

+0

哈希集合,以避免您的最終值 –

+0

請參考此鏈接https://www.javatpoint.com/java-hashset –

0

我無法正確理解您的適配器。但是我可以給你一個建議,因爲我遇到了這個問題,並且爲我找到了出路。不知道它是否適用於您的問題,但您可以嘗試: 從ArrayList刪除項目後,您可以編寫以下代碼:

RequestAdapter.this.remove(getItem(position));

此代碼將從listView中刪除已刪除的項目。希望它能起作用。謝謝。