0

Ich brauche meine Artikel eins nach dem anderen zu meinem RcyclerView zum Beispiel in den recyclerView und erste Element hinzufügen zeigen dann ein weiteres Element hinzufügen ....Android - Artikel zu RecyclerView einzeln hinzufügen?

Ich habe eine Salve, die dann zu einem Dienst verbinden Sie mich einige Daten, in diesem Volley nenne ich eine Methode:

private void makeJsonArryReq(String uri) { 
    userPointList = new ArrayList<>(); 
    orginal = new ArrayList<>(); 

    final JsonArrayRequest req = new JsonArrayRequest(uri, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 

        orginal = MarketingPoints_JSONParser.FeedOriginal(response.toString(), mUser_Code, ReportActivity.this); 
        userPointList = MarketingPoints_JSONParser.parseFeed(response.toString(), mUser_Code, ReportActivity.this); 
        FillList(); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d("Custom Log Error", "Error: " + error.getMessage()); 
     } 
    }); 
    AppController.getInstance().addToRequestQueue(req, tag_json_arry); 
} 

, wenn ich diese Methode aufrufen FillList(); es auf RecyclerView erste Element füllen und zeigen, Wie kann ich für finalisierte an Adapter hören und FillList(); wieder für den nächsten Punkt nennen.

Mein FillList():

public void FillList() { 
     Geocoder geocoder = new Geocoder(activity, Locale.getDefault()); 
      List<Address> addresses; 
      StepModel stp = null; 
      List<StepModel> Step = new ArrayList<>(); 
      if (check < userPointList.size()) { 
       try { 
        addresses = geocoder.getFromLocation(userPointList.get(check).getLat(), userPointList.get(check).getLng(), 1); 
        stp = new StepModel(); 
        stp.setsCity(addresses.get(0).getAdminArea()); 
        stp.setsStreet(addresses.get(0).getThoroughfare()); 
        stp.setSlat(userPointList.get(check).getLat()); 
        stp.setSlng(userPointList.get(check).getLng()); 
        stp.setSdate(userPointList.get(check).getDate()); 
        stp.setStime(userPointList.get(check).getTime()); 
        stp.setsCounts(userPointList.get(check).getCounts()); 
        stp.setSprofilePhoto(userPointList.get(check).getProfilePhoto()); 
        stp.setsUserCode(userPointList.get(check).getUserCode()); 
        Step.add(stp); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       pointAdapter = new PointsList_Adapter(Step, ReportActivity.this,this, city, street); 
       Points_Recycler.setAdapter(pointAdapter); 
       pointAdapter.notifyDataSetChanged(); 
       check++; 
      }else { 
       return; 
      } 
    } 

Erklären:

ich zu einem Dienst verbinden dann bekomme ich ein json dann wandle ich es und Speicher in einem List .In meines json Ich habe zwei spezifische Daten (Lat und lng), dass ich Name Land und Name Straße bekommen sollte (zum Beispiel 100 lat lng) dann auf recyclerView zeigen, aber es wird lange Zeit, weil ich recyclerView auf eins füllen sollte.

Mein Adapter:

public class PointsList_Adapter extends RecyclerView.Adapter<PointsList_Adapter.ViewHolder> { 
    int count = 0; 
    private List<StepModel> mpList; 
    public static Activity activity; 
    public static boolean flagItem = true; 
    public static boolean flagToast = true; 

    private mstep Mstep; 
    public PointsList_Adapter(List<StepModel> userCodeList, Activity activity) { 
     this.mpList = userCodeList; 
     this.activity = activity; 

    } 

    @Override 
    public PointsList_Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // create a new view 
     View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.listpoints_cardview, null); 

     // create ViewHolder 
     ViewHolder viewHolder = new ViewHolder(itemLayoutView); 
     return viewHolder; 
    } 
    @Override 
    public void onBindViewHolder(PointsList_Adapter.ViewHolder viewHolder, final int position) { 

     String dateValue = mpList.get(position).getDate(); 
     final String countValue = String.valueOf(mpList.get(position).getCounts()); 
     final Double lat = mpList.get(position).getLat(); 
     final Double lng = mpList.get(position).getLng(); 
     final String userCode = mpList.get(position).getUserCode(); 
     final String time = mpList.get(position).getTime(); 
     final int counts = mpList.get(position).getCounts(); 
     final String city = mpList.get(position).getCity(); 
     final String street = mpList.get(position).getStreet(); 

     viewHolder.txtDate.setText(dateValue); 
     viewHolder.txtPoints.setText(lat + " , " + lng); 
     viewHolder.txtTime.setText(time); 
     viewHolder.txtAddress.setText(city + " , " + street); 
     viewHolder.txtCount.setText(countValue); 
    } 

    @Override 
    public int getItemCount() { 
     return mpList.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView txtDate, txtPoints, txtTime, txtAddress, txtCount; 
     public LinearLayout lLstPoints; 

     public ViewHolder(View itemLayoutView) { 
      super(itemLayoutView); 
      txtDate = (TextView) itemLayoutView.findViewById(R.id.txtDate); 
      txtPoints = (TextView) itemLayoutView.findViewById(R.id.txtPoints); 
      txtTime = (TextView) itemLayoutView.findViewById(R.id.txtTime); 
      txtAddress = (TextView) itemLayoutView.findViewById(R.id.txtAddress); 
      txtCount = (TextView) itemLayoutView.findViewById(R.id.txtCount); 
      lLstPoints = (LinearLayout) itemLayoutView.findViewById(R.id.lLstPoints); 
     } 
    } 
} 
+0

Bitte erklären. !! – AndiGeeky

+0

Fügen Sie ein Element in die Liste des Adapters ein und rufen Sie 'notifyDataSetChanged()' auf. Erstellen Sie keinen neuen Adater während des Hinzufügens von Daten in der Liste :) – AndiGeeky

+0

@ AndiGeeky. Bitte lesen Sie meine Erklärung. Danke –

Antwort

1

Bitte fügen Sie unten Methode in Ihrer adapter:

public reloadList(ArrayList<String> mpList) { 
    this.mpList.addAll(mpList); 
} 

Wenn Sie die Liste aktualisieren möchten oder unten Code in Ihrer listview, verwenden Sie eine weitere Artikel hinzuzufügen:

public void FillList() { 
     Geocoder geocoder = new Geocoder(activity, Locale.getDefault()); 
     List<Address> addresses; 
     StepModel stp = null; 
     List<StepModel> Step = new ArrayList<>(); 
     if (check < userPointList.size()) { 
      try { 
       addresses = geocoder.getFromLocation(userPointList.get(check).getLat(), userPointList.get(check).getLng(), 1); 
       stp = new StepModel(); 
       stp.setsCity(addresses.get(0).getAdminArea()); 
       stp.setsStreet(addresses.get(0).getThoroughfare()); 
       stp.setSlat(userPointList.get(check).getLat()); 
       stp.setSlng(userPointList.get(check).getLng()); 
       stp.setSdate(userPointList.get(check).getDate()); 
       stp.setStime(userPointList.get(check).getTime()); 
       stp.setsCounts(userPointList.get(check).getCounts()); 
       stp.setSprofilePhoto(userPointList.get(check).getProfilePhoto()); 
       stp.setsUserCode(userPointList.get(check).getUserCode()); 
       Step.add(stp); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      // Just update your list and call notifyDataSetChanged() 
      pointAdapter .reloadList(Step); 
      pointAdapter .notifyDataSetChanged(); 
      check++; 
     }else { 
      return; 
     } 
    } 

Initialisieren Sie Ihren Adapter wie folgt:

ArrayList<StepModel> userCodeList = new ArrayList<StepModel>(); 
pointAdapter = new PointsList_Adapter(userCodeList , activity) ; 

Vielen Dank.

+0

Mein Adapter erweitert RecyclerView. Wo, wo ich Ihre Methode hinzufügen. Wenn Sie Ihre Methode hinzufügen, erhalten Sie einen Fehler bei der Ivalid-Deklaration der Methode, geben Sie den Typ requierd.and in der Aktivität ein, wenn ich diesen Wert addiere pointAdapter.reloadList(); sag mir kann Methode reloadList() nicht auflösen. –

+0

@ Jo Jo Roid: Ändern Sie Ihre 'Liste ' zu 'ArrayList ' – AndiGeeky

+0

Ich benutze von Ihrem Code, aber crash mich. NullPointerException ==> pointAdapter.reloadList (Schritt); –

2

Nachdem alle Daten vom Server auf einmal abrufen, innerhalb FillList() -Methode Sie verwenden sollten, während oder do..while Schleifen Ihre code.You iterieren, wenn bedingt verwendet Schleife, die nur einmal ausgeführt wird.

Andernfalls können Sie eine Methode im Adapter erstellen, um ein Element zu Ihrer Liste hinzuzufügen und dann notifydatasetchanged() -Methode dort aufzurufen.

public void add(Object obj){ 
    mArraylist.add(obj); 
    notifyDataSetChanged(); 
}