ViewPager + PagerAdapter W / Pagination无法正常工作

时间:2017-06-26 15:23:23

标签: android pagination android-viewpager android-pageradapter

我有一个图库/幻灯片活动,允许用户在照片之间滑动。每个“页面”只是TouchImageView。那里有一个分页逻辑,我可以看到它正在相应地调用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();
        }
    }
}

这就是结果: http://imgur.com/nA1TzfI

我不知道2天发生了什么事。请帮忙!

3 个答案:

答案 0 :(得分:0)

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

(即实际重新设置适配器)。这样做的缺点是寻呼机可能会回到选择第一页。为避免这种情况,您需要在某处保存最新页面并在之后恢复。

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

答案 1 :(得分:0)

您不必从适配器类加载更多照片,在活动类中可以使用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);

答案 2 :(得分:0)

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

  1. 加载新页面数据,但不附加到适配器
  2. 确保页面没有滚动,然后将新页面数据附加到适配器(ViewPager.OnPageChangeListener#onPageScrolled's positionOffsetPixels == 0)中。
  3. 使用偏移量=新页面数据的大小(请命名为newPosition)为view pager更新当前项
  4. 将数据重新绑定为3个片段:newPosition - 1newPositionnewPosition + 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步),以便为用户提供更好的UX。如果我们在数据到来时立即追加数据,并且用户正在滚动,则查看寻呼机的setCurrentItem会产生奇怪的变化。

我在https://github.com/tuanchauict/DemoPaginationViewPager处创建一个简单的版本。请看看