在我的自定义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)将项目中的数据映射到视图。 –