2016-04-25 6 views
0

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.

+0

In welchen Fällen wird es nicht sofort aktualisiert? – barq

+0

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

+0

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

Antwort

0

Sie erstellen einen neuen Adapter und rufen notifyDatasetChanged auf, haben aber setAdapter nicht mit dem neuen Adapter als Parameter aufgerufen, weshalb Ihre Liste nicht aktualisiert wird.

Sie benötigen

setAdapter(assignAdapter) 

oder Wiederverwendung rufen Sie Ihren assignAdapter bestehende und dann notifyDatasetChanged() auf es nennen.

+0

Ich kann den Adapter nicht auf meine Listenansicht setzen. weil es in meinem Fragment definiert ist. & Ich lösche das Element aus der Array-Liste in meiner Aktivität und rufe notifyDataSetChanged auf. – Rakesh

+0

Im onClickListener Ihrer Schaltfläche erstellen Sie einen neuen assignAdapter und legen ihn nie als Adapter für die Liste fest. Dieser Adapter wird also nie benutzt. – barq

+0

Ich habe viel gesucht, aber keine Lösung gefunden. Sir, können Sie mir sagen, wie man den Adapter für die Listenansicht einstellt, die in der Fragment-Klasse definiert ist. – Rakesh