ViewPager显示重复数据

3

我遇到了以下问题,第一个viewpager错误地显示了第二个viewpager的内容,在滑动到第二个viewpager后,内容相同,正确地显示了第二个viewpager。为了解决这个问题,我必须滑动到第三个viewpager让FragmentStatePagerAdapter重新加载,然后第一个viewpage的内容就会正确显示。

package com.example.android.effectivenavigation;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends FragmentActivity {
    static int myViewPagerItem;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyPageAdapter mFragmentStatePagerAdapter = new MyPageAdapter(getSupportFragmentManager());
        setContentView (R.layout.refuel_viewpager);
        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(mFragmentStatePagerAdapter);
    }
    public static class MyPageAdapter extends FragmentStatePagerAdapter {
        public MyPageAdapter(FragmentManager fm) {
            super(fm);
        }
        @Override
        public Fragment getItem(int i) {
            myViewPagerItem = i;
            return new ViewFragment();
        }
        @Override
        public int getCount() {
            return 10;
        }
    }
    public static class ViewFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            View v = inflater.inflate(R.layout.view, container, false);
            TextView text1 = (TextView) v.findViewById(R.id.text1);
            text1.setText("Page: " + myViewPagerItem);
            return v;
        }
    }

}

你没有填充适配器,所以我的ViewPagerItem显示相同的值。 - DjHacktorReborn
它显示:页面2、2、3、4...,当我向后滑动4、3、2、1时,我如何填充适配器? - rnascimento13
1个回答

1
这样做
public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyPageAdapter mFragmentStatePagerAdapter = new MyPageAdapter(getSupportFragmentManager());
        setContentView (R.layout.refuel_viewpager);
        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(mFragmentStatePagerAdapter);
    }
    public  class MyPageAdapter extends FragmentStatePagerAdapter {
        public MyPageAdapter(FragmentManager fm) {
            super(fm);
        }
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
        @Override
        public Fragment getItem(int i) {
            return new ViewFragment(i);
        }
        @Override
        public int getCount() {
            return 10;
        }
    }
    public  class ViewFragment extends Fragment {
        int pageno;
        public ViewFragment(int pageNo){
            this.pageno=pageNo;
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            View v = inflater.inflate(R.layout.view, container, false);
            TextView text1 = (TextView) v.findViewById(R.id.text1);
            text1.setText("Page: " + pageno);
            return v;
        }
    }

}

解决了,非常感谢。现在我想知道为什么我的方法不起作用! - rnascimento13
1
因为您正在使用静态变量在片段中显示。当您说静态时,它不是类实例的一部分,它只创建一次并在多个片段实例之间共享。而且您正在getItem()方法中更改它,由于它是静态的,因此在所有片段实例中都会反映和重复。 - Biraj Zalavadia
我的问题已经解决并得到了适当的指导,再也无法要求更多了!再次感谢你! - rnascimento13
3
这样做是错误的,请确保永远不要使用非空的片段构造函数,更好的方法是使用setArguments将页面编号作为参数发送给Bundle! - Necronet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接