2017-06-20 77 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中删除已删除的项目。希望它能起作用。谢谢。