我真的希望有人可以帮我解决这个问题。我现在已经挣扎了一段时间。
我有一个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);
}