Ich benutze Ansicht Pager mit Swiping-Tab-Layouts. Und ich zeige Listenansicht von Daten an, die kundenspezifischen Adapter verwenden. Und auch ein Klick auf die Listenansicht Ich habe eine Detailansicht der Listenansicht, in der ich die Daten detaillierter darstelle. In dieser Detailaktivität führe ich einige Änderungen an den Daten durch (einige Post-Methoden). Danach erstelle ich eine Instanz der customAdapter-Klasse und rufe notifyDataSetChanged() auf, um die Listenansicht zu aktualisieren. Mein Problem hier ist, dass die Listenansicht einige Male schnell aktualisiert wird, und manchmal gibt es eine Verzögerung von einigen Sekunden. Kann mir also jemand empfehlen, dass ich die Listenansicht ordnungsgemäß verwende und welche Änderungen vorgenommen werden müssen, um die Listenansicht zu aktualisieren, wenn eine Post-Methode ausgeführt wird? Mein Code Fragment Klasse:Bitte schlagen Sie mich bei der korrekten Verwendung von notifyDataSetChanged()
private void showJsonData(String response) {
try {
String serviceID = LoggedInUserStore.getLoggedInServiceId(getContext());
List<Complaint> userList = new ArrayList<>(); //ArrayList of type user(POJO CLASS)
JSONArray jsonArray = new JSONArray(response);
for (int i = 0; i < jsonArray.length(); i++) {
if (serviceID.equals(jsonArray.getJSONObject(i).getString("ServiceID"))) {
if (jsonArray.getJSONObject(i).getString("CallStatusID").equalsIgnoreCase("1")) {
userList.add(0, Complaint.fromJson(jsonArray.getJSONObject(i))); //
}
}
}
assignAdapter = new AssignAdapter(getActivity(), userList);
listView.setAdapter(assignAdapter);
listView.invalidateViews();
assignAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
My custom adapter class
public class AssignAdapter extends BaseAdapter implements Filterable {
List<Complaint> ticket = new ArrayList<>();
private Context context;
String ticketNo, complaint, raiseDate;
Complaint user;
List<Complaint> temporaryList = new ArrayList<>();
/*String status, priority;*/
public AssignAdapter(Context context, List<Complaint> ticket) {
this.context = context;
this.ticket = ticket;
this.temporaryList = ticket;
}
@Override
public int getCount() {
return temporaryList.size();
}
@Override
public Object getItem(int position) {
return temporaryList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public class viewHolderItem {
TextView ticketNumberText, complaintNameText, raisedDateText;
}
//Set the layout for the fragment and return it.
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
viewHolderItem holder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.custom_list_view, null, true);
holder = new viewHolderItem();
holder.ticketNumberText = (TextView) convertView.findViewById(R.id.ticketIdSupervisor);
holder.complaintNameText = (TextView) convertView.findViewById(R.id.complaintNameSupervisor);
convertView.setTag(holder);
} else {
holder = (viewHolderItem) convertView.getTag();
}
user = temporaryList.get(position);
if (user != null) {
//Get the Ticket Number
Typeface custom_font = Typeface.createFromAsset(context.getAssets(), "fonts/DroidSerif.ttf");
ticketNo = temporaryList.get(position).getTicketNumber();
holder.ticketNumberText.setText(ticketNo);
holder.ticketNumberText.setTag("ticketNumber");
holder.ticketNumberText.setTypeface(custom_font);
//Get the complaint Name
complaint = temporaryList.get(position).getComplaintDetails();
holder.complaintNameText.setText(complaint);
holder.complaintNameText.setTag("complaint");
holder.complaintNameText.setTypeface(custom_font);
}
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(context.getApplicationContext(), ComplaintDetailsSupervisor.class);
i.putExtra("COMPLAINT NAME", temporaryList.get(position).getComplaintDetails());
i.putExtra("RAISED DATE", temporaryList.get(position).getRaisedDate().substring(0, 10));
context.startActivity(i);
}
});
notifyDataSetChanged();
return convertView;
}
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
}
Meine Liste Detail Aktivitätsklasse
dialogButtonOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
assignComplaint();
al.remove(position);
AssignAdapter assignAdapter = new AssignAdapter(getApplicationContext(), al);
assignAdapter.notifyDataSetChanged();
ComplaintDetailsSupervisor.this.finish();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
dialogButtonNo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
}
});
}
public void assignComplaint() throws JSONException {
//my custom method...
}
In der Listenansicht Detail Aktivitätsklasse i tue dies
al.remove(position);
AssignAdapter assignAdapter = new AssignAdapter(getApplicationContext(), al);
assignAdapter.notifyDataSetChanged();
ComplaintDetailsSupervisor.this.finish();
Entfernen der Position der Listenansicht und sofortiges Aufrufen des Adapters. Das funktioniert gut, aber ich weiß nicht, warum es manchmal nicht aktualisiert .. Kann sein, wenn die Listenansicht ein einzelnes Element hat, wird es nicht sofort aktualisiert.
In welchen Fällen wird es nicht sofort aktualisiert? – barq
Sagen Sie, wenn es 5-6 Elemente in der Listenansicht gibt, wenn ich versuche, eine Post-Methode auszuführen, wird das Objekt nicht entfernt. Wenn ich eine Post-Methode ausführe, muss das Objekt aus der Listenansicht entfernt werden. Aber manchmal geht es nicht ... bis ich zum Aktualisieren nach oben wische. – Rakesh
Ich schließe lv Detailaktivität ab, wenn Benutzer die Post-Methode ausführen und ihn zurück an das Fragment senden, wo die Daten in der Listenansicht mit wenigen Informationen angezeigt werden. Der Gegenstand muss aus diesem Fragment entfernt werden, was manchmal nicht passiert. – Rakesh