Android:从PagerAdapter获取片段

时间:2015-10-10 01:05:09

标签: java android android-fragments android-viewpager android-pageradapter

因此,我尝试使用自定义FragmentStatePagerAdapter实现ViewPager。在我的MainActivity中,我试图访问正在显示的片段,以便我可以修改该片段视图中的子节点。

这是自定义片段:

public class CustomFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_custom, container, false);
        return rootView;
    }
}

这里是FragmentStatePagerAdapter:

public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

    private int NUM_PAGES;

    public ScreenSlidePagerAdapter(FragmentManager fm, int NUM_PAGES) {
       super(fm);
       this.NUM_PAGES = NUM_PAGES;
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }

    @Override
    public Fragment getItem(int position) {
        return new CustomFragment();
    }

}

这是MainActivity中的重要部分。这是我尝试获取寻呼机适配器当前显示的片段的地方。 mPagerAdapter.instantiateItem返回一个片段,但是当我调用primaryFragment.getView()时,我得到一个空指针。

    moveViewPagerToIndex(); // Move the view pager to NUM_PAGES / 2 to start
    primaryFragment = (CustomFragment) mPagerAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem());
    updateFragment();

updateFragment():

    ArrayList<Button> arrayList = Utility.getCellsFromCalendarFragment(primaryFragment.getView());
    for (int i = 0; i < arrayList.size(); i++) {
         // do stuff with all the cells
    }

Utility.getCellsFromCalendarFragment(查看rootView)

public static ArrayList<Button> getCellsFromCalendarFragment(View rootView) {
    ArrayList<Button> cellList = new ArrayList<>();
    cellList.add((Button) rootView.findViewById(R.id.cell00));
    cellList.add((Button) rootView.findViewById(R.id.cell01));
    cellList.add((Button) rootView.findViewById(R.id.cell02));
    // There are a lot more than 3 cells... There's roughly 50 cells.
    return cellList
}

我在Android Studio中浏览了调试器并观看了变量&#39; primaryFragment&#39;。当我调用mViewPager.instantiateItem(...)时,我得到一个实际的CustomFragment。问题是&#39; primaryFragment&#39;现在有一个空视图所以当我尝试访问视图来修改单元格时,我得到一个NullPointerException。

  

引起:java.lang.NullPointerException:尝试调用虚方法&#39; android.view.View android.view.View.findViewById(int)&#39;在空对象引用上

如何从此片段中获取视图?这甚至是从视图寻呼机获取片段的正确方法吗?我已经把头发撕掉了。我只是希望显示片段并修改其视图和子节点。

谢谢!

1 个答案:

答案 0 :(得分:1)

FragmentStatePagerAdapter.instantiateItem()通过调用Fragment创建新的getItem()。每次调用getItem()时,CustomFragment都会创建isntantiateItem()的新实例。因此,当您调用CustomFragment时,您将获得CustomFragment的新实例,而不是适配器正在使用的实例。

您可能需要在适配器中存储CREATE EVENT `midnight_event` ON SCHEDULE EVERY 1 DAY STARTS '2015-10-10 00:00:00' ON COMPLETION PRESERVE DISABLE ON SLAVE DO BEGIN START TRANSACTION; INSERT INTO todays_table VALUES (col, col, col, col) SELECT col, col, col FROM pending_table WHERE time_stamp >= CURDATE() AND time_stamp < CURDATE() + INTERVAL 1 DAY; DELETE FROM pending_table WHERE time_stamp >= CURDATE() AND time_stamp < CURDATE() + INTERVAL 1 DAY; COMMIT; END 的实例,并编写一个方法来通过索引获取它们。

我不确定您的完整用例,因此我无法建议您如何继续修改适配器。我的意思是我不知道你要访问哪个片段,如果它是当前显示的片段,或者远离屏幕的一个片段。