我的ListView
包含ViewPager
行。当ViewPager
滚出屏幕时,我想保存其页面位置。当用户再次滚动到ViewPager
时,我想恢复其上次保存的页面位置。
我正在尝试使用以下代码完成此操作:
public class MyBaseAdapter extends BaseAdapter {
// Row ids that will come from server-side, uniquely identifies each
// ViewPager
private List<String> mIds = new ArrayList<String>();
private Map<String, Integer> mPagerPositions = new HashMap<String, Integer>();
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String id = mIds.get(position);
View rootView = convertView;
if (rootView == null) {
rootView = LayoutInflater.from(parent.getContext()).inflate(
R.layout.row, null);
}
ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.pager);
Integer pagerPosition = mPagerPositions.get(id);
if (pagerPosition != null) {
viewPager.setCurrentItem(pagerPosition);
}
viewPager.setOnPageChangeListener(new MyPageChangeListener(id));
return rootView;
}
@Override
public int getCount() {
return mIds.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
private class MyPageChangeListener extends
ViewPager.SimpleOnPageChangeListener {
private String mId;
public MyPageChangeListener(String id) {
mId = id;
}
@Override
public void onPageSelected(int position) {
mPagerPositions.put(mId, position);
}
}
}
页面位置在setPagerPosition()
的第一次调用时保存。之后,当ViewPager
离开屏幕时,onPageSelected()
会在保存的第一个页面位置被调用 - 覆盖onPageSelected()
仍然存在时发生的所有先前ViewPager
次调用可见。
这样做的正确方法是什么?
答案 0 :(得分:3)
解决方案是在ViewPager不可见时不覆盖寻呼机位置。 Android中似乎存在一个错误,当浏览ListView时ViewPager离开屏幕时会调用onPageSelected。
@Override
public void onPageSelected(int position) {
if (viewPager.isShown()) {
mTopicPositions.put(mId, position);
}
}
答案 1 :(得分:0)
我认为您可以通过indexOfChild(viewPager.getFocusedChild())
获取当前显示的位置,并将其存储在共享首选项中,并可以在需要时检索它。希望这有帮助