با سلام خدمت استاد محترم
ممنون میشم در مورد روش پیاده سازی pagination در والی توضیح بفرمایید
api من به صورتی هست که می تونم شماره page رو بهش پاس بدم و مطالب جدید رو دریافت کنم...
می خوام وقتی به انتهای اسکرول برسم شماره page بعدی به api پاس داده بشه و مطالب جدید رو به recycler view اضافه کنم
روش های مختلفی رو تو stack over flow و github دیدم ولی هیچ کدوم بدردم نخورد ...یادگیریم ناقص هست و خوب متوجه نشدم..
ممنون میشم مراحل اجرا رو برام شرح بدید
سلام وقت بخیر،
این پروژه رو به عنوان نمونه داخل گیت هاب قرار دادم. مشاهده کنید، اگر که سوالی بود همینجا مطرح کنید.
خیلی ممنونم از راهنمایی هاتون
من از کتابخانه ای که معرفی کردید استفاده کردم...
یک مشکلی هست هنوز ....
من در ادامه پست های 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);
}
}
}
}