Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewPager+;带分页的PagerAdapter工作不正常_Android_Pagination_Android Viewpager_Android Pageradapter - Fatal编程技术网

Android ViewPager+;带分页的PagerAdapter工作不正常

Android ViewPager+;带分页的PagerAdapter工作不正常,android,pagination,android-viewpager,android-pageradapter,Android,Pagination,Android Viewpager,Android Pageradapter,我有一个画廊/幻灯片活动,允许用户在照片之间滑动。每个“页面”都只是一个页面。这里有一个分页逻辑,我可以看到它正在相应地调用API。但是,即使在调用notifyDataSetChanged之后,我也无法进一步滑动。代码如下: Activity { ViewPager vp; CustomPagerAdapter pagerAdapter; onCreate() { //api callback pagerAdapter = new Cus

我有一个画廊/幻灯片活动,允许用户在照片之间滑动。每个“页面”都只是一个页面。这里有一个分页逻辑,我可以看到它正在相应地调用API。但是,即使在调用notifyDataSetChanged之后,我也无法进一步滑动。代码如下:

Activity {
    ViewPager vp;
    CustomPagerAdapter pagerAdapter;

    onCreate() {
        //api callback
        pagerAdapter = new CustomPagerAdapter();
        vp.setAdapter(pagerAdapter);
    }
}

CustomPagerAdapter() {
    TouchImageView imageView;
    List<Photos> photos;

    int getCount() {
        return photos == null ? 0 : photos.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View itemView = mLayoutInflater.inflate(R.layout.pager_image, container, false);
        imageView = (TouchImageView) itemView.findViewById(R.id.photo);
        Glide.with(context)
                .load(photos.get(position).getUrl())
                .into(imageView);

        container.addView(itemView);

        if (position == photos.size()-1) {
            loadMorePhotos();
        }

        return itemView;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((RelativeLayout) object);
    }

    void loadMorePhotos() {
        //call api and stuff
        void onResponse(Call call, Response<List<Photo>> response) {
            photos.addAll(response.body);
            notifyDataSetChanged();
        }
    }
}
活动{
可视寻呼机;
定制页面雷达;
onCreate(){
//api回调
pagerAdapter=新的CustomPagerAdapter();
副总裁setAdapter(pagerAdapter);
}
}
CustomPagerAdapter(){
触摸图像视图;
列出照片;
int getCount(){
返回照片==null?0:photos.size();
}
@凌驾
公共布尔值isViewFromObject(视图,对象){
返回视图==对象;
}
@凌驾
公共对象实例化项(视图组容器,int位置){
View itemView=MLAyoutFlater.充气(R.layout.pager_图像,容器,错误);
imageView=(TouchImageView)itemView.findViewById(R.id.photo);
带(上下文)滑动
.load(photos.get(position.getUrl())
.进入(图像视图);
container.addView(itemView);
if(position==photos.size()-1){
加载更多照片();
}
返回项目视图;
}
@凌驾
public int getItemPosition(对象){
返回位置\无;
}
@凌驾
公共项(视图组容器、int位置、对象){
container.removeView((RelativeLayout)对象);
}
void loadMorePhotos(){
//调用api之类的东西
void onResponse(调用、响应){
照片.addAll(response.body);
notifyDataSetChanged();
}
}
}
这就是结果:


我两天都不知道发生了什么。请帮忙

这可能不太理想,但在调用
notifyDatasetChanged()
的地方,您可以尝试调用
vp.setAdapter(pagerAdapter)

(即,实际重新设置适配器)。这样做的一个缺点是,寻呼机可能会返回到选择第一页。为了避免这种情况,您需要将最新的页面保存到某个位置,然后再进行恢复


正如我所说,这并不理想,但它可能会有所帮助。

您不必从适配器类加载更多照片,在活动类中,您可以在滚动最后一项时使用
onPageScrolled
,并调用api,再次滚动并设置适配器。在再次设置适配器时,还可以在调用api之前保存查看页面的状态

    private boolean isLastPageSwiped;
    private int counterPageScroll;

private OnPageChangeListener mListener = new OnPageChangeListener() {

    @Override
    public void onPageSelected(int arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub
     if (position == 6 && positionOffset == 0 && !isLastPageSwiped){
        if(counterPageScroll != 0){
            isLastPageSwiped=true;
            //call api 
        }
        counterPageScroll++;
    }else{
        counterPageScroll=0;
    }

    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub

    }
};
并使用此侦听器

vp.setOnPageChangeListener(mListener);

我们可以使用这种方法在ViewPager上进行分页(使用片段)

  • 加载新页面数据,但不附加到适配器
  • 确保页面未滚动,然后将新页面数据附加到适配器中(
    ViewPager.OnPageChangeListener#onPageScrolled的positionOffsetPixels==0
  • 使用偏移量=新页面数据的大小(我们称之为
    newPosition
    )更新视图寻呼机的当前项
  • 将数据重新绑定到3个片段:
    newPosition-1
    newPosition
    newPosition+1
  • 为了获取当前片段,我们可以使用片段管理器

        private fun getFragment(position: Int): PageFragment? =
            supportFragmentManager.fragments.firstOrNull {
                (it as? PageFragment)?.position == position // always pass possition value into the fragment
            } as? PageFragment
    
    我们需要在不滚动时添加数据(步骤2),以便为用户提供更好的用户体验。如果我们在数据到来时立即添加数据,并且用户正在滚动,则view pager的
    setCurrentItem
    将做出奇怪的移动

    我在这里创建了一个简单的版本。请看一看