通过重置停止ListView内的ViewPager

时间:2013-03-13 07:37:15

标签: android android-listview android-viewpager

我的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次调用可见。

这样做的正确方法是什么?

2 个答案:

答案 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())获取当前显示的位置,并将其存储在共享首选项中,并可以在需要时检索它。希望这有帮助