【问题标题】:Stop ViewPagers inside ListView from resetting停止 ListView 内的 ViewPagers 重置
【发布时间】:2013-03-13 07:37:14
【问题描述】:

我有一个ListView,其中包含ViewPagers 的行。当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() 被调用并使用保存的第一页位置 - 覆盖之前在 ViewPager 仍然可见时发生的任何 onPageSelected() 调用。

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

【问题讨论】:

  • ids 列表是什么?
  • ListView 中将来自服务器端的行的 id。
  • @Simian,在拨打setCurrentItem之前尝试拨打setOnPageChangeListener

标签: android android-listview android-viewpager


【解决方案1】:

解决方案是在 ViewPager 不可见时不覆盖寻呼机位置。 Android 中似乎存在一个错误,当滚动 ListView 时 ViewPager 离开屏幕时会调用 onPageSelected。

@Override
public void onPageSelected(int position) {
    if (viewPager.isShown()) {
        mTopicPositions.put(mId, position);
    }
}

【讨论】:

    【解决方案2】:

    我认为您可以通过indexOfChild(viewPager.getFocusedChild()) 获取当前显示的位置并将其存储在共享首选项中,并且可以在需要时检索它。希望这会有所帮助

    【讨论】:

    • 当 ViewPager 在 ListView 中再次可见时,我需要检索位置。也就是说,当用户滚动回 ViewPager 时。存储在 SharedPreferences 中是多余的。并且存储视图会破坏 ListView 对视图的回收。
    • 不需要存储视图,只存储位置。获取全局多维整数数组intPosition[ListViewPosition][ViewPagerPosition]。将值存储在其中并根据值显示视图。
    • @Simian 你用过吗?任何 +ve 结果?
    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 2013-12-10
    • 1970-01-01
    • 2020-09-14
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多