تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ یوسف محمدیانی
روش اجرای infinite scroll و یا pagination در volley
سعید شاهینی حل شده توسط سعید شاهینی

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

 

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

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

 

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

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

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

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

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

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

بهترین پاسخ
سعید شاهینی ۲۲ فروردین ۱۳۹۹، ۰۴:۱۵

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

یک مشکلی هست هنوز ....
من در ادامه پست‌های 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);
            }
        }
    }
}



کد‌های پروژه 

یوسف محمدیانی ۲۲ فروردین ۱۳۹۹، ۱۹:۰۵