我有一个图库/幻灯片活动,允许用户在照片之间滑动。每个“页面”只是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天发生了什么事。请帮忙!
答案 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(带有片段)上进行分页
ViewPager.OnPageChangeListener#onPageScrolled's positionOffsetPixels == 0
)中。newPosition
)为view pager更新当前项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步),以便为用户提供更好的UX。如果我们在数据到来时立即追加数据,并且用户正在滚动,则查看寻呼机的setCurrentItem
会产生奇怪的变化。
我在https://github.com/tuanchauict/DemoPaginationViewPager处创建一个简单的版本。请看看