【发布时间】:2020-01-23 12:05:43
【问题描述】:
我有 api 调用请求 参数:(页面,pageSize:所需的最大项目数(默认 25,最大 100。来自 reddit api 文档)),我想在RecyclerView。我的数据加载成功,但问题是如何向服务器请求下一页。如何使用 addOnScrollListener
方法执行分页网络服务类
public interface RedditWebService {
@GET("top.json")
Observable<Response> getTopPublication(@Query("count")int count,
@Query("limit")int pageSize);
}
适配器类
public class RedditAdapter extends RecyclerView.Adapter<RedditAdapter.RedditViewHolder> {
private List<Child> childList;
private Context context;
public RedditAdapter(Context context, List<Response.Data.Child> childList) {
this.childList = childList;
this.context = context;
}
@NonNull
@Override
public RedditViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.items_layout, parent, false);
return new RedditViewHolder(view);
}
@SuppressLint("DefaultLocale")
@Override
public void onBindViewHolder(@NonNull RedditViewHolder holder, int position) {
final Child child = childList.get(position);
holder.txtAuthor.setText(child.getmData().getmAuthor());
String timeAgo = TimeAgo.getTimeAgo(child.getmData().getmCreated());
Log.d("Time", "" + timeAgo);
holder.txtDate.setText(timeAgo);
holder.txtComment.setText(String.format("Comments: %d", child.getmData().getmNumComments()));
Picasso.get().load(child.getmData().getmThumbnail()).placeholder(R.drawable.placeholder).
transform(ImageTransformation.getTransformation(holder.imageView)).into(holder.imageView);
if (!child.getmData().getmThumbnail().equals("")) {
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context.getApplicationContext(), SecondActivity.class);
intent.putExtra("extraImage", child.getmData().getmThumbnail());
context.startActivity(intent);
}
});
}
}
@Override
public int getItemCount() {
return (childList == null) ? 0 : childList.size();
}
public class RedditViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView txtDate, txtAuthor, txtComment;
public RedditViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.image_view);
txtDate = itemView.findViewById(R.id.txt_date);
txtAuthor = itemView.findViewById(R.id.txt_author);
txtComment = itemView.findViewById(R.id.txt_comments_num);
}
}
}
主活动
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private LinearLayoutManager layoutManager;
private ProgressBar progressBar;
private RedditAdapter adapter;
private List<Child> redditList = new ArrayList<>();
private CompositeDisposable disposable = new CompositeDisposable();
private int page = 0;
private int pageSize = 50;
@Inject
RedditWebService webService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((BaseApplication) getApplication()).getComponent().inject(this);
setContentView(R.layout.activity_main);
progressBar = findViewById(R.id.progress_bar);
recyclerView = findViewById(R.id.recycler_view);
layoutManager = new LinearLayoutManager(this);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
fetchData();
}
private void fetchData() {
progressBar.setVisibility(View.VISIBLE);
disposable.add(webService.getTopPublication(page,pageSize)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response>() {
@Override
public void accept(Response response) throws Exception {
adapter = new RedditAdapter(MainActivity.this, response.getData().getChildren());
recyclerView.setAdapter(adapter);
progressBar.setVisibility(View.GONE);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Toast.makeText(MainActivity.this, throwable.toString(), Toast.LENGTH_LONG).show();
}
}));
}
提前致谢
【问题讨论】:
-
请参考此链接simplifiedcoding.net/android-paging-library-tutorial,它是通过Retrofit完成的。
-
您可能希望使用 PageKeyedDataSource 从当前页面加载下一个/上一个记录。请查看developer.android.com/reference/androidx/paging/…。另请参阅本教程和示例实现,medium.com/@harunwangereka/…。这是 Kotlin 实现,但也应该为您提供 Java 实现的公平概念。
-
@KalpeshRupani 我会尝试像这个教程一样写,谢谢
-
祝你好运!! @MohammedQadah
标签: java android json android-recyclerview