Java 分页数据来自对RecyclerView的改装响应
我正在尝试使用改型从API获取数据,并在android的RecyclerView中对这些数据进行分页 我在“loadFirstPage”活动中有两个功能,它只加载4项改装后的响应,第二个功能是“loadNextPage”,每次我向下滚动RecyclerView时,它会加载4项其他内容:Java 分页数据来自对RecyclerView的改装响应,java,android,Java,Android,我正在尝试使用改型从API获取数据,并在android的RecyclerView中对这些数据进行分页 我在“loadFirstPage”活动中有两个功能,它只加载4项改装后的响应,第二个功能是“loadNextPage”,每次我向下滚动RecyclerView时,它会加载4项其他内容: public class MainActivity extends AppCompatActivity { private PaginationAdapter paginationAdapter;
public class MainActivity extends AppCompatActivity {
private PaginationAdapter paginationAdapter;
private MovieService movieService;
private ProgressBar progressBar;
private boolean isLoading = false;
private boolean isLastPage = false;
private int currentPage = 0;
List<Movie> sub;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recyclerview);
progressBar = findViewById(R.id.progressbar);
movieService = ClientApi.getClient().create(MovieService.class);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
paginationAdapter = new PaginationAdapter(this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(paginationAdapter);
recyclerView.addOnScrollListener(new PaginationScrollListener(linearLayoutManager) {
@Override
protected void loadMoreItems() {
isLoading = true;
loadNextPage();
}
@Override
public boolean isLastPage() {
return isLastPage;
}
@Override
public boolean isLoading() {
return isLoading;
}
});
loadFirstPage();
}
private void loadNextPage() {
movieService.getMovies(1140).enqueue(new Callback<List<Movie>>() {
@Override
public void onResponse(Call<List<Movie>> call, Response<List<Movie>> response) {
paginationAdapter.removeLoadingFooter();
isLoading = false;
List<Movie> results = response.body();
for (int i = 4; i < results.size(); i += 4) {
List<Movie> sub = results.subList(i, Math.min(results.size(), i + 4));
paginationAdapter.addAll(sub);
currentPage += sub.size();
if (currentPage < results.size()) paginationAdapter.addLoadingFooter();
else isLastPage = true;
}
}
@Override
public void onFailure(Call<List<Movie>> call, Throwable t) {
t.printStackTrace();
}
});
}
private void loadFirstPage() {
movieService.getMovies(1140).enqueue(new Callback<List<Movie>>() {
@Override
public void onResponse(Call<List<Movie>> call, Response<List<Movie>> response) {
List<Movie> results = response.body();
progressBar.setVisibility(View.GONE);
for (int i = 0; i < 3; i += 3) {
sub = results.subList(i, Math.min(results.size(), i + 4));
paginationAdapter.addAll(sub);
currentPage += sub.size();
if (sub.size() < results.size()) paginationAdapter.addLoadingFooter();
else isLastPage = true;
}
}
@Override
public void onFailure(Call<List<Movie>> call, Throwable t) {
}
});
}
}
public类MainActivity扩展了AppCompatActivity{
专用分页适配器分页适配器;
私人电影服务;
私人ProgressBar ProgressBar;
私有布尔isLoading=false;
私有布尔值isLastPage=false;
private int currentPage=0;
列表子节点;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView RecyclerView=findViewById(R.id.RecyclerView);
progressBar=findViewById(R.id.progressBar);
movieService=ClientApi.getClient().create(movieService.class);
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(此,LinearLayoutManager.VERTICAL,false);
paginationAdapter=新的paginationAdapter(此);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(分页适配器);
recyclerView.addOnScrollListener(新分页ScrollListener(linearLayoutManager){
@凌驾
受保护的无效loadMoreItems(){
isLoading=true;
loadNextPage();
}
@凌驾
公共布尔isLastPage(){
返回最后一页;
}
@凌驾
公共布尔isLoading(){
返回卸载;
}
});
loadFirstPage();
}
私有void loadNextPage(){
getMovies(1140).enqueue(新回调()命令){
@凌驾
公共void onResponse(调用、响应){
分页适配器。removeLoadingFooter();
isLoading=false;
列表结果=response.body();
对于(int i=4;i
这是适配器的代码:
public class PaginationAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<Movie> movieList;
private static final int LOADING = 0;
private static final int ITEM = 1;
private boolean isLoadingAdded = false;
public PaginationAdapter(Context context) {
this.context = context;
movieList = new LinkedList<>();
}
public void setMovieList(List<Movie> movieList) {
this.movieList = movieList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case ITEM:
View viewItem = inflater.inflate(R.layout.item_list, parent, false);
viewHolder = new MovieViewHolder(viewItem);
break;
case LOADING:
View viewLoading = inflater.inflate(R.layout.item_progress, parent, false);
viewHolder = new LoadingViewHolder(viewLoading);
break;
}
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
Movie movie = movieList.get(position);
switch (getItemViewType(position)) {
case ITEM:
MovieViewHolder movieViewHolder = (MovieViewHolder) holder;
movieViewHolder.movieTitle.setText(String.valueOf(movie.getRequestNumber()));
break;
case LOADING:
LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;
loadingViewHolder.progressBar.setVisibility(View.VISIBLE);
break;
}
}
@Override
public int getItemCount() {
return movieList == null ? 0 : movieList.size();
}
@Override
public int getItemViewType(int position) {
return (position == movieList.size() - 1 && isLoadingAdded) ? LOADING : ITEM;
}
public void addLoadingFooter() {
isLoadingAdded = true;
add(new Movie());
}
public void removeLoadingFooter() {
isLoadingAdded = false;
int position = movieList.size() - 1;
Movie result = getItem(position);
if (result != null) {
movieList.remove(position);
notifyItemRemoved(position);
}
}
public void add(Movie movie) {
movieList.add(movie);
notifyItemInserted(movieList.size() - 1);
}
public void addAll(List<Movie> moveResults) {
for (int i = 0; i < moveResults.size(); i += 5) {
List<Movie> sub = moveResults.subList(i, Math.min(moveResults.size(), i + 5));
}
for (Movie result : moveResults) {
add(result);
}
}
public Movie getItem(int position) {
return movieList.get(position);
}
public class MovieViewHolder extends RecyclerView.ViewHolder {
private TextView movieTitle;
public MovieViewHolder(View itemView) {
super(itemView);
movieTitle = (TextView) itemView.findViewById(R.id.movie_title);
}
}
public class LoadingViewHolder extends RecyclerView.ViewHolder {
private ProgressBar progressBar;
public LoadingViewHolder(View itemView) {
super(itemView);
progressBar = (ProgressBar) itemView.findViewById(R.id.loadmore_progress);
}
}
}
公共类分页适配器扩展了RecyclerView.Adapter{
私人语境;
私人名单电影演员;
私有静态最终整数加载=0;
私有静态最终整数项=1;
私有布尔值isLoadingAdded=false;
公共分页适配器(上下文){
this.context=上下文;
movieList=newlinkedlist();
}
公共无效setMovieList(列表movieList){
this.movieList=movieList;
}
@非空
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
RecyclerView.ViewHolder ViewHolder=null;
LayoutInflater充气器=LayoutInflater.from(parent.getContext());
开关(视图类型){
案例项目:
查看视图项=充气机。充气(R.layout.item_列表,父项,false);
viewHolder=新的电影viewHolder(viewItem);
打破
箱子装载:
视图加载=充气机充气(R.layout.item\u进度,父项,false);
viewHolder=新加载viewHolder(视图加载);
打破
}
返回视图持有者;
}
@凌驾
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder,int位置){
Movie=movieList.get(位置);
开关(getItemViewType(位置)){
案例项目:
moviewholder moviewholder=(moviewholder)holder;
movieViewHolder.movieTitle.setText(String.valueOf(movie.getRequestNumber());
打破
箱子装载:
LoadingViewHolder LoadingViewHolder=(LoadingViewHolder)holder;
加载ViewHolder.progressBar.setVisibility(View.VISIBLE);
打破
}
}
@凌驾
public int getItemCount(){
返回movieList==null?0:movieList.size();
}
@凌驾
public int getItemViewType(int位置){
return(position==movieList.size()-1&&isLoadingAdded)?加载:项;
}
public void addLoadingFooter(){
isLoadingAdded=true;
添加(新电影());
}
公共空间删除目录(){
isLoadingAdded=false;
int position=movieList.size()-1;
电影结果=获取项目(位置);
如果(结果!=null){
电影列表。移除(位置)