Android:Viewpager中的GridView - 滑动时显示不正确的数据

时间:2015-11-16 07:51:07

标签: android android-fragments android-viewpager

我真的希望有人可以帮我解决这个问题。我现在已经挣扎了一段时间。

我有一个Android项目,它使用导航抽屉作为切换片段的菜单。在一个片段中,我使用了一个tablayout和一个viewpager,它有一个片段(因为它使用相同的数据和布局),但只是根据你所依据的标签对数据进行不同的排序。数据在gridview中。

我面临的问题是,viewpager在错误的索引处显示错误的数据。例如,在第一个选项卡中,它显示第二个选项卡的数据。第二个和第三个选项卡很好,但如果您一直滚动到第三个选项卡并返回到第一个选项卡,则第一个选项卡是正确的。

另一个问题是,如果我滑动到第二个标签,然后在网格视图中向下滚动然后备份,它也会因某些奇怪的原因更改数据。

我尝试了许多方法,并在这里研究解决方案,并按照它应该完成的方式实现它,但我无法让它正常工作。我不确定我错过了什么或我错在哪里。非常感谢您的帮助。

这是我的代码:

ContactsTabHolderFragment:

 @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.fragment_contacts,container,false);

        viewPager = (ViewPager)rootView.findViewById(R.id.contacts_pager);
        tabLayout = (TabLayout)rootView.findViewById(R.id.contacts_tab);

        contactsPagerAdapter = new ContactsPagerAdapter(getContext(),getChildFragmentManager());
        viewPager.setAdapter(contactsPagerAdapter);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setTabsFromPagerAdapter(contactsPagerAdapter);

        viewPager.setOffscreenPageLimit(1);

        return rootView;
    }

ContactsTabFragment:

public static ContactsTabFragment newInstance(int param1) {
        ContactsTabFragment fragment = new ContactsTabFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_PARAM1, param1);
        fragment.setArguments(args);
        return fragment;
    }

    public ContactsTabFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getInt(ARG_PARAM1);
        }
        Log.i("FRAGMENT " + mParam1 + " CREATED","here");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        rootView = inflater.inflate(R.layout.fragment_contacts_all, container, false);

        grid = (GridView)rootView.findViewById(R.id.contacts_grid);
        contactsManager = new ContactsManager(grid,getContext());
        contactsManager.displayContactTab(mParam1);

        return rootView;

    }

ViewPagerAdapter:

public class ContactsPagerAdapter extends FragmentStatePagerAdapter {

private final String[] titles = new String[]{"Recent","Frequent","A-Z"};
private Context context;

    public ContactsPagerAdapter(Context context,FragmentManager manager){

        super(manager);
        this.context = context;
    }


    @Override
    public Fragment getItem(int position){

        return ContactsTabFragment.newInstance(position);
    }

    @Override
    public CharSequence getPageTitle(int position){

        return titles[position];
    }

    @Override
    public int getCount(){
       return 3;

    }

和ContactsManager类:

public ContactsManager(GridView gridView, Context context){
        this.contactsGridView = gridView;
        this.context = context;
    }

    public ContactsManager(){
    }

    public void displayContactTab(int contactTabPosition){
        switch (contactTabPosition){
            case 0: Collections.sort(contacts, ContactItem.contactDateComparator);
                break;
            case 1: Collections.sort(contacts,ContactItem.contactFrequencyComparator);
                break;
            case 2: Collections.sort(contacts,ContactItem.contactNameComparator);
                break;
            default:
                break;
        }
        setUpContactGridAdapter();
    }

    public void setUpContactGridAdapter(){
        adapter = new ContactGridAdapter(context,contacts);
        contactsGridView.setAdapter(adapter);
        BankingApplication.getInstance().addAdapter(adapter);
        contactsGridView.setOnItemClickListener(this);
    }

0 个答案:

没有答案