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您使用了它吗?有什么结果吗?