2017-03-24 3 views
0

Ich habe einen Recycler und in ihm gibt es cardviews, wo ich Informationen von einem REST-Service abrufe, ich versuche, eine endlose scroll zu implementieren, Es wird angenommen, dass Benutzer 10 cardviews jedes Mal, wenn er scrollt, bis es nicht mehr gibt Kartenansichten zeigen, wie kann ich das erreichen?Wie implementiert man Infinite Scrolling mit RecyclerView?

Ich habe ein paar Beispiele gesehen, aber keiner von ihnen hat mir wirklich geholfen, wie es geht. Ich weiß nicht einmal, was ich in die adapter.class oder in meine Fragment.class schreiben muss, weil ich nicht verstehe, wie man das implementiert, es wäre toll, wenn mir jemand den richtigen Weg erklären könnte, die unendliche Bildlauffunktion zu implementieren Mein Code ...

Vielen Dank im Voraus.

MainAdapter.class

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> implements View.OnClickListener 
{ 
    private ArrayList<Business> businessList; 
    private Activity activity; 
    private int layoutMolde,idb; 

    public MainAdapter(Activity activity, ArrayList<Business> list, int layout) 
    { 
     this.activity = activity; 
     this.businessList = list; 
     layoutMolde = layout; 
    } 

    @Override 
    public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_row, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) 
    { 
     holder.mTitle.setText(businessList.get(position).getBusiness_name()); 
     holder.number_rating.setText(businessList.get(position).getRating().toString()); 
     Glide.with(activity).load(businessList.get(position).getLogo_url_string()).into(holder.mImg); 
    } 

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

    @Override 
    public void onClick(View v) 
    { 

    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView mTitle; 
     public ImageView mImg; 
     public ImageView logo; 
     public RatingBar main_rating; 
     public TextView number_rating; 

     public ViewHolder(View itemView) 
     { 
      super(itemView); 
      mTitle = (TextView) itemView.findViewById(R.id.nom_business_main); 
      number_rating = (TextView) itemView.findViewById(R.id.number_rating); 
      mImg = (ImageView) itemView.findViewById(R.id.img_main); 
      main_rating=(RatingBar) itemView.findViewById(R.id.rating_main); 
      main_rating.setRating((float)1); 
      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) 
       { 

        Intent in = new Intent(v.getContext(), BusinessPremium.class); 
        int position = getAdapterPosition(); 
        idb = businessList.get(position).getId(); 
        in.putExtra("no", idb); 
        v.getContext().startActivity(in); 
       } 
      }); 
     } 
    } 
} 

FeedsFragment.class

public class FeedsFragment extends Fragment 
    { 

     private ArrayList<Business> arrayBusiness,arrayBasics; 
     private Gson gson; 

     private static final Type BUSINESS_TYPE = new TypeToken<ArrayList<Business>>() {}.getType(); 
     private RecyclerView.LayoutManager mLayoutManager; 

     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      View android = inflater.inflate(R.layout.fragment_feeds, container, false); 

      if (!internetConnectionCheck(FeedsFragment.this.getActivity())) 
      { 
       Toast.makeText(getApplicationContext(), "Error de Conexión", Toast.LENGTH_LONG).show(); 
      } 

      new RequestBase(getActivity()) { 

       @Override 
       public JsonObject onHttpOk(JsonObject response) throws JSONException { 

        JsonObject objeto, pagination_details = null, details, premium_img; 
        JsonArray data; 

        if (getActivity() == null) 
         return response; 

        if (response.get("pagination") == null) 
        { 
         objeto = response; 

        } else { 
         objeto = response; 
         pagination_details = response.get("pagination").getAsJsonObject(); 
         data = objeto.get("data").getAsJsonArray(); 
         gson = new Gson(); 
         arrayBusiness = gson.fromJson(data, BUSINESS_TYPE); 
         Log.d("size", String.valueOf(arrayBusiness.size())); 
         FeedsFragment.this.getActivity().runOnUiThread(new Runnable() 
         { 
          @Override 
          public void run() 
          { 

           RecyclerView recycler = (RecyclerView) FeedsFragment.this.getActivity().findViewById(R.id.recycler_main); 
           MainAdapter adapter = new MainAdapter(getActivity(), arrayBusiness, R.layout.main_row); 

           recycler.setNestedScrollingEnabled(false); 
           mLayoutManager = new GridLayoutManager(FeedsFragment.this.getActivity(), 2); 
           recycler.setLayoutManager(mLayoutManager); 
           recycler.setAdapter(adapter); 

           GifTextView loading = (GifTextView)FeedsFragment.this.getActivity().findViewById(R.id.loading); 
           TextView loadingText = (TextView)FeedsFragment.this.getActivity().findViewById(R.id.loadingText); 
           loading.setVisibility(View.GONE); 
           loadingText.setVisibility(View.GONE); 

          } 
         }); 
        } 
        if (pagination_details.isJsonNull()) { 
         Log.d("Paginacion", pagination_details.toString()); 
        } 
        return objeto; 
       } 

       @Override 
       public void onHttpCreate(JsonObject response) throws JSONException 
       { 

       } 

       @Override 
       public void onHttpUnprocessableEntity(JsonObject response) throws JSONException 
       { 
        this.cancel(true); 
        final String error = response.get("errors").toString(); 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(getActivity().getApplicationContext(), error, Toast.LENGTH_LONG).show(); 
         } 
        }); 
       } 
      }.execute("businesses/premiums", "GET"); 

      return android; 
     } 
} 
+0

Verwenden Sie NestedScrollview anstelle von ScrollView –

Antwort

1

Sie mit SwipeRefreshLayout in android erfrischen können erfrischen und in der auf Refresh-Override-Methode aufrufen Ihre api

Hinweis: Setzen Sie Ihre API-Aufruf-Anfrage in eine Methode und Cal l diese Methode inyour onRefresh-Methode von SwipeRefreshLayout

0

Sie können eine scrollListener zu Ihrem Recyclerview hinzufügen.

prüfen eine ähnliche Antwort here

Und die Haupt Post SO here

Wo, prüft die scrollListener wo genau Sie in der recyclerview sind und basieren auf gewissen Logik (die Sie flexibel schreiben kann) machen ein zweiter Anruf!

0

Erstellen Sie eine statische boolesche Variable namens "ready" und initialisieren Sie sie auf false.

Fügen Sie die if ready-Bedingung in der onLoadMore-Methode wie folgt hinzu.

In onBindViewHolder auf true setzen, wenn die Position des Elements zuletzt ist.

1

Wenn Sie RecyclerView.Adapter schreiben, müssen Sie auf jeden Fall die getItemCount-Methode angeben, die die richtige Anzahl von Elementen (möglicherweise groß) zurückgibt. RecyclerView wird auf eigene Initiative die onBindViewHolder (Halter, Position) Methode dieses Adapters aufrufen. Alles, was Sie brauchen, ist die Funktionalität zum Abrufen von Daten, die für diese Position relevant sind. Es gibt keinen Unterschied, wenn Ihre Liste kleiner als Bildschirm ist, etwas größer als der Bildschirm oder Integer.MAX_VALUE Größe. RecyclerView wird darauf achten, dass nicht zu viele zusätzliche Objekte abgerufen/zugewiesen werden.

Sie tun nicht Notwendigkeit scroll Zuhörer zu implementieren oder auf andere Weise ausdrücklich das Scrollen zu behandeln.

Der einzige knifflige Teil ist, dass Sie möglicherweise eine lange Aktion wie Server-Aufruf benötigen, um einige Elemente zu erhalten. Dann gib einfach den nicht initialisierten Holder (leere Sicht) beim ersten Aufruf zurück und fang damit an, die benötigte Zeile im Hintergrundthread abzurufen.Wenn Sie es haben, rufen Sie notifyDataSetChanged oder notifyItemRangeChanged, und RecyclerView wird sich kümmern, um sich selbst zu aktualisieren.

Aus Performance-Gründen würde ich dringend empfehlen, Inhalt in Blöcken der festen Größe zu aktualisieren, anstatt einzelne Serveranforderungen für jede angezeigte Zeile zu senden. Für einige öffentliche Server wie Google Books ist dies eindeutig eine Voraussetzung, da sie Kontingentgrenzen pro Anforderung haben.

Wenn Sie den vollständigen Quellcode anzeigen müssen, wie dies möglicherweise implementiert werden könnte, gibt es eine open source project here in GitHub.

Verwandte Themen