روش اجرای infinite scroll و یا pagination در volley

پرسیده شده
فعالیت 1484 روز پیش
دیده شده 1132 بار
0

با سلام خدمت استاد محترم 

 

ممنون میشم در مورد روش پیاده سازی pagination در والی توضیح بفرمایید

api من به صورتی هست که می تونم شماره page رو بهش پاس بدم و مطالب جدید رو دریافت کنم...

 

می خوام وقتی به انتهای اسکرول برسم شماره page بعدی به api پاس داده بشه و مطالب جدید رو به recycler view اضافه کنم

روش های مختلفی رو تو stack over flow  و github دیدم ولی هیچ کدوم بدردم نخورد ...یادگیریم ناقص هست و خوب متوجه نشدم..

ممنون میشم مراحل اجرا رو برام شرح بدید

فایل پیوست

یوسف محمدیانی
یوسف محمدیانی

21 فروردین 99

1
حذف شده

سلام وقت بخیر،

این پروژه رو به عنوان نمونه داخل گیت هاب قرار دادم. مشاهده کنید، اگر که سوالی بود همینجا مطرح کنید.

https://github.com/saeedsh92/Infinite-Scroll-Provider

فایل پیوست

سعید شاهینی

توسط

سعید شاهینی

22 فروردین 99

حذف شده
سلام ...ممنونم ولی موقع اضافه کردن implementation وقتی implementation 'ss.com.infinitescrollprovider:infinitescrollprovider:1.0' رو وارد می کنم خطا میده : ERROR: Failed to resolve: ss.com.infinitescrollprovider:infinitescrollprovider:1.0 Show in Project Structure dialog Affected Modules: app چی کار باید کرد؟
یوسف محمدیانی

22 فروردین 99

حذف شده
لازم نیست که لایبرری رو به پروژه اضافه کنید، فقط کلاسش رو به پروژه تون کپی کنید
سعید شاهینی

22 فروردین 99

0
حذف شده

خیلی ممنونم از راهنمایی هاتون 
من از کتابخانه ای که معرفی کردید استفاده کردم...

یک مشکلی هست هنوز ....
من در ادامه پست های page 1  نمی تونم پست های page2 و همچنین پست های بعدی رو داشته باشم
و وقتی به انتهای اسکرول میرستم محتوای page2 جایگزین page1 میشه و در ادامه اون نمیاد

 

package com.academyresane.infinittest;

import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements OnLoadMoreListener {
    private ProgressBar progressBar;
    private static final String TAG = "MainActivity";
    private RecyclerView recyclerView;
    private PostListAdapter postAdapter;
    private int page=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        page+=1;
        final StringRequest stringRequest = new StringRequest(Request.Method.GET,
                ApiService.BASE_URL+"wp-json/wp/v2/posts?_embed&page="+page+"&per_page=10",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

//                        avi.hide();

                        try {
                            JSONArray jsonArray = new JSONArray(response);
                            List<Post> posts = new ArrayList<>();
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject postItem = jsonArray.getJSONObject(i);
                                Post post = new Post();
                                post.setTitle(postItem.getJSONObject("title").getString("rendered"));
                                post.setContent(postItem.getJSONObject("excerpt").getString("rendered"));
                                post.setFullContent(postItem.getJSONObject("content").getString("rendered"));
                                post.setDate(postItem.getString("date"));
                                post.setCategory(postItem.getJSONObject("_embedded").getJSONArray("wp:term").getJSONArray(0).getJSONObject(0).getString("name"));
                                post.setAuthor(postItem.getJSONObject("_embedded").getJSONArray("author").getJSONObject(0).getString("name"));


                                JSONObject imageData = postItem.getJSONObject("_embedded");
                                if (imageData.has("wp:featuredmedia")){
                                    post.setImgURl(
                                            postItem.getJSONObject("_embedded")
                                                    .getJSONArray("wp:featuredmedia")
                                                    .getJSONObject(0)
                                                    .getJSONObject("media_details")
                                                    .getJSONObject("sizes")
                                                    .getJSONObject("thumbnail")
                                                    .getString("source_url")
                                    );
                                    post.setImageRulMain(
                                            postItem.getJSONObject("_embedded")
                                                    .getJSONArray("wp:featuredmedia")
                                                    .getJSONObject(0)
                                                    .getJSONObject("media_details")
                                                    .getJSONObject("sizes")
                                                    .getJSONObject("full")
                                                    .getString("source_url")
                                    );
                                }
                                post.setIdPost(postItem.getInt("id"));
                                posts.add(post);
                            }




                            RecyclerView recyclerView = findViewById(R.id.wrapperPostList);
                            PostListAdapter postListAdapter = new PostListAdapter(MainActivity.this);
                            postListAdapter.addPosts(posts);
                            recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, RecyclerView.VERTICAL, false));
                            recyclerView.setAdapter(postListAdapter);

                            InfiniteScrollProvider infiniteScrollProvider=new InfiniteScrollProvider();
                            infiniteScrollProvider.attach(recyclerView,MainActivity.this);

                            progressBar=(ProgressBar)findViewById(R.id.progress_bar);


                            Log.i(TAG, "onResponse: "+response);
                        } catch (JSONException e) {
                            e.printStackTrace();
                            Toast.makeText(MainActivity.this, "امکان اتصال وجود ندارد!", Toast.LENGTH_SHORT).show();
                            Log.i(TAG, "onCatch: "+e.toString());
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

                Toast.makeText(MainActivity.this, "امکان اتصال وجود ندارد!", Toast.LENGTH_SHORT).show();
                Log.i(TAG, "onErrorResponseMessage: "+error.toString());

            }
        });
        final RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
        requestQueue.add(stringRequest);




    }

    @Override
    public void onLoadMore() {
        progressBar.setVisibility(View.VISIBLE);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                page+=1;
                final StringRequest requestNext = new StringRequest(Request.Method.GET,
                        ApiService.BASE_URL+"wp-json/wp/v2/posts?_embed&page="+page+"&per_page=10",
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {

//                        avi.hide();

                                try {
                                    JSONArray jsonArray = new JSONArray(response);
                                    List<Post> posts = new ArrayList<>();
                                    for (int i = 0; i < jsonArray.length(); i++) {
                                        JSONObject postItem = jsonArray.getJSONObject(i);
                                        Post post = new Post();
                                        post.setTitle(postItem.getJSONObject("title").getString("rendered"));
                                        post.setContent(postItem.getJSONObject("excerpt").getString("rendered"));
                                        post.setFullContent(postItem.getJSONObject("content").getString("rendered"));
                                        post.setDate(postItem.getString("date"));
                                        post.setCategory(postItem.getJSONObject("_embedded").getJSONArray("wp:term").getJSONArray(0).getJSONObject(0).getString("name"));
                                        post.setAuthor(postItem.getJSONObject("_embedded").getJSONArray("author").getJSONObject(0).getString("name"));


                                        JSONObject imageData = postItem.getJSONObject("_embedded");
                                        if (imageData.has("wp:featuredmedia")){
                                            post.setImgURl(
                                                    postItem.getJSONObject("_embedded")
                                                            .getJSONArray("wp:featuredmedia")
                                                            .getJSONObject(0)
                                                            .getJSONObject("media_details")
                                                            .getJSONObject("sizes")
                                                            .getJSONObject("thumbnail")
                                                            .getString("source_url")
                                            );
                                            post.setImageRulMain(
                                                    postItem.getJSONObject("_embedded")
                                                            .getJSONArray("wp:featuredmedia")
                                                            .getJSONObject(0)
                                                            .getJSONObject("media_details")
                                                            .getJSONObject("sizes")
                                                            .getJSONObject("full")
                                                            .getString("source_url")
                                            );
                                        }
                                        post.setIdPost(postItem.getInt("id"));
                                        posts.add(post);
                                    }


                                    RecyclerView recyclerView = findViewById(R.id.wrapperPostList);
                                    PostListAdapter postListAdapter = new PostListAdapter(MainActivity.this);
                                    postListAdapter.addPosts(posts);
                                    recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, RecyclerView.VERTICAL, false));
                                    recyclerView.setAdapter(postListAdapter);

                                    InfiniteScrollProvider infiniteScrollProvider=new InfiniteScrollProvider();
                                    infiniteScrollProvider.attach(recyclerView,MainActivity.this);

                                    progressBar=(ProgressBar)findViewById(R.id.progress_bar);


                                    progressBar=(ProgressBar)findViewById(R.id.progress_bar);

                                    Log.i(TAG, "onResponse: "+response);
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                    Toast.makeText(MainActivity.this, "امکان اتصال وجود ندارد!", Toast.LENGTH_SHORT).show();
                                    Log.i(TAG, "onCatch: "+e.toString());
                                }

                            }
                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                        Toast.makeText(MainActivity.this, "امکان اتصال وجود ندارد!", Toast.LENGTH_SHORT).show();
                        Log.i(TAG, "onErrorResponseMessage: "+error.toString());

                    }
                });
                final RequestQueue nextQueue = Volley.newRequestQueue(MainActivity.this);
                nextQueue.add(requestNext);

            }
        },1000);
    }
}


کد های آداپتر:


package com.academyresane.infinittest;

import android.content.Context;
import android.os.Build;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.recyclerview.widget.RecyclerView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;


public class PostListAdapter extends RecyclerView.Adapter<PostListAdapter.PostListViewHolder> {

    private List<Post> posts = new ArrayList<>();
    private Context context;

    public PostListAdapter(Context context){
        this.context = context;
    }

    public void addPosts(List<Post> posts) {
        this.posts.addAll(posts);
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public PostListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new PostListViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post,parent,false));
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onBindViewHolder(@NonNull PostListViewHolder holder, int position) {
        holder.bind(posts.get(position));
    }


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

    public class PostListViewHolder extends RecyclerView.ViewHolder{
        private TextView titlePost;
        private TextView exceptPost;
        private ImageView thumbnailPost;
        public PostListViewHolder(@NonNull View itemView) {
            super(itemView);
            titlePost=itemView.findViewById(R.id.titleArticle);
            exceptPost=itemView.findViewById(R.id.description_post);
            thumbnailPost =itemView.findViewById(R.id.thumbnail_Post);
        }
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public void bind(final Post post){
            titlePost.setText(post.getTitle().toString());
            exceptPost.setText(Html.fromHtml(post.getContent()));
            thumbnailPost.setClipToOutline(true);
            if (post.getImgURl()!=null){
                Picasso.get().load(post.getImgURl().toString())
                        .placeholder(R.drawable.tiny_placeholder).into(thumbnailPost);
            }else {
                Picasso.get().load(R.drawable.tiny_placeholder).into(thumbnailPost);
            }


        }

    }

}



کد های پروژه 

فایل پیوست

یوسف محمدیانی

توسط

یوسف محمدیانی

22 فروردین 99

حذف شده
مشکل حل شد باید در بخش on load more فقط این رو می نوشتم postAdapter.addPosts(posts); progressBar.setVisibility(View.GONE); ممنونم استاد به خاطر معرفی این library فوق العاده ، سریع و کار راه انداز
یوسف محمدیانی

23 فروردین 99