Android 停止ListView内的ViewPagers重置

Android 停止ListView内的ViewPagers重置,android,android-listview,android-viewpager,Android,Android Listview,Android Viewpager,我有一个ListView,其中包含ViewPagers行。当ViewPager从屏幕上滚下时,我想保存它的页面位置。当用户再次滚动到ViewPager时,我想恢复上次保存的页面位置 我正试图通过以下代码实现这一点: public class MyBaseAdapter extends BaseAdapter { // Row ids that will come from server-side, uniquely identifies each // ViewPager

我有一个
ListView
,其中包含
ViewPager
s行。当
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);
        }
    }
}
公共类MyBaseAdapter扩展了BaseAdapter{
//来自服务器端的行ID唯一地标识每个行
//寻呼机
private List mIds=new ArrayList();
私有映射mPagerPositions=newhashmap();
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
字符串id=mIds.get(位置);
视图rootView=convertView;
if(rootView==null){
rootView=LayoutInflater.from(parent.getContext()).flate(
R.layout.row,空);
}
ViewPager ViewPager=(ViewPager)rootView.findViewById(R.id.pager);
整数pagerPosition=mPagerPositions.get(id);
如果(页面位置!=null){
viewPager.setCurrentItem(页面位置);
}
setOnPageChangeListener(新的MyPageChangeListener(id));
返回rootView;
}
@凌驾
public int getCount(){
返回中间尺寸();
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
私有类MyPageChangeListener扩展
ViewPager.SimpleOnPageChangeListener{
私有字符串mId;
公共MyPageChangeListener(字符串id){
mId=id;
}
@凌驾
已选择页面上的公共无效(内部位置){
MPAGERPOSITES.put(中间,位置);
}
}
}
页面位置在第一次调用
setPagerPosition()
时保存。之后,当
ViewPager
离开屏幕时,调用保存的第一页位置的
onPageSelected()
,覆盖
ViewPager
仍然可见时发生的任何以前的
onPageSelected()
调用


正确的方法是什么?

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

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

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

什么是
ids
列表?ListView中来自服务器端的行的id。@Simian,在调用
setCurrentItem
之前,请尝试调用
setOnPageChangeListener
,我需要检索ViewPager在ListView中再次可见时的位置。也就是说,当用户滚动回ViewPager时。存储在SharedReferences中是一种过分的做法。存储视图会破坏ListView对视图的循环利用。无需存储视图,只需存储点即可。获取全局多维整数数组
intPosition[ListViewPosition][ViewPagerPosition]
。将值存储在其中,并按值显示视图。@Simian您使用了它吗?有什么结果吗?