Tôi đang sử dụng ví dụ ViewPager
với ActionBar
tab lấy từ tài liệu Android here.IllegalStateException: PagerAdapter của ứng dụng thay đổi nội dung của bộ chuyển đổi mà không gọi PagerAdapter # notifyDataSetChanged
Thật không may, ngay sau khi tôi gọi addTab
phương pháp, các ứng dụng bị treo với ngoại lệ sau:
IllegalStateException: Các ứng dụng của PagerAdapter thay đổi nội dung các adapter mà không gọi PagerAdapter # notifyDataSetChanged! Dự kiến mục bộ chuyển đổi số 0, tìm thấy 1.
Đây là mã FragmentPagerAdapter
:
public static class TabsAdapter extends FragmentPagerAdapter
implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(Activity activity, ViewPager pager) {
super(activity.getFragmentManager());
mContext = activity;
mActionBar = activity.getActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i=0; i<mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
}
Tôi không thay đổi bộ chuyển đổi của tôi trong bất kỳ phần nào khác của mã của tôi và tôi đang gọi addTab
phương pháp từ chủ đề chính, phương pháp addTab
kết thúc bằng một cuộc gọi đến notifyDataSetChanged
. Theo tài liệu đề xuất cần thực hiện:
PagerAdapter hỗ trợ thay đổi tập dữ liệu. Thay đổi bộ dữ liệu phải xuất hiện trên chủ đề chính và phải kết thúc bằng một cuộc gọi để thông báoDataSetChanged() tương tự như bộ điều hợp AdapterView có nguồn gốc từ BaseAdapter.
Tôi đã tìm kiếm này trong một thời gian. Tôi là người duy nhất tìm thấy nó lẻ rằng lỗi đọc như thể tôi không gọi notifyDataSetChanged(), khi thực sự tôi cần phải thực hiện hành động (setCurrentItem trong trường hợp của tôi) Sau khi notifyDataSetChanged()? – wizurd