Java 分页数据来自对RecyclerView的改装响应

Java 分页数据来自对RecyclerView的改装响应,java,android,Java,Android,我正在尝试使用改型从API获取数据,并在android的RecyclerView中对这些数据进行分页 我在“loadFirstPage”活动中有两个功能,它只加载4项改装后的响应,第二个功能是“loadNextPage”,每次我向下滚动RecyclerView时,它会加载4项其他内容: public class MainActivity extends AppCompatActivity { private PaginationAdapter paginationAdapter;

我正在尝试使用改型从API获取数据,并在android的RecyclerView中对这些数据进行分页 我在“loadFirstPage”活动中有两个功能,它只加载4项改装后的响应,第二个功能是“loadNextPage”,每次我向下滚动RecyclerView时,它会加载4项其他内容:

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){
电影列表。移除(位置)