6

ListViews の行を含む がありますViewPager。aViewPagerが画面外にスクロールされたときに、そのページ位置を保存したい。ユーザーがもう一度スクロールすると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

これを行う正しい方法は何ですか?

4

2 に答える 2

3

解決策は、ViewPager が表示されていないときにページャーの位置を上書きしないことでした。ListView をスクロールしているときに ViewPager が画面から消えると onPageSelected が呼び出されるという Android のバグがあるようです。

@Override
public void onPageSelected(int position) {
    if (viewPager.isShown()) {
        mTopicPositions.put(mId, position);
    }
}
于 2013-03-17T22:04:17.837 に答える
0

indexOfChild(viewPager.getFocusedChild())現在の表示位置を取得して共有設定に保存し、必要なときにいつでも取得できると思います。お役に立てれば

于 2013-03-16T05:34:08.260 に答える