0

需要帮助来修复我在https://stackoverflow.com/a/9275732/1938357中看到的代码。我需要的解决方案是在基于 viewpager 的应用程序中的任何页面上获取当前视图

下面是代码供参考

public View getCurrentView(ViewPager pager) {
for (int i = 0; i < pager.getChildCount(); i++) {
    View child = pager.getChildAt(i);
    if (child.getX() <= pager.getScrollX() + pager.getWidth()
         && child.getX() + child.getWidth() >= pager.getScrollX() + pager.getWidth()) {
        return child;
     }

 }
return getChildAt(0);

我正在尝试访问视图寻呼机中的当前视图并使用上面的代码。当我向前滚动时它工作正常。但是当我向后滚动时,在向后滚动 2 次后,这将停止工作。

Public class myActivity extends FragmentActivity
//Variable declarations
protected void onCreate(Bundle savedInstanceState) {
ViewPager mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
View CurrView;

OnPageChangeListener pageChangelistener = new OnPageChangeListener() {
  @Override
  public void onPageSelected(int pageSelected) {
    doTextViewChnges();//access the text view and update it based on pageSelected
    ---THIS IS WHERE I AM STUCK IN TRYING TO GET THE TEXTVIEW IN MY CURRENT FRAGMWNT/VIEW-------
 }

mPager.setOnPageChangeListener(pageChangelistener);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
  public ScreenSlidePagerAdapter(android.support.v4.app.FragmentManager  fm) {
    super(fm);
 }

 @Override
 public android.support.v4.app.Fragment getItem(int position) { 
    return ScreenSlidePageFragment.create(position, <other parameters I want to pass>);
 }

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

下面是我的 ScreenSlidePageFragment 类

public class ScreenSlidePageFragment extends android.support.v4.app.Fragment {

public static final String ARG_PAGE = "pagenumber";
public static final String ARG_PAGEARRAY = "pages";

private int mPageNumber;
//Declare other variables

@SuppressLint("NewApi")
public static ScreenSlidePageFragment create(int pageNumber, String[] pages, int bookmarkPageNumber, String storyName, int linesInOnePage) {
    ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_PAGE, pageNumber);
    args.putStringArray(ARG_PAGEARRAY, pages);
    fragment.setArguments(args); 
    return fragment;
}

@SuppressLint("NewApi")
public ScreenSlidePageFragment() {
}

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mPageNumber = getArguments().getInt(ARG_PAGE);
    pages = getArguments().getStringArray(ARG_PAGEARRAY);
}

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

    //load layout with all components filled up for that page
    loadView(rootView);
    return rootView;
}
public int getPageNumber() {
    return mPageNumber;
}
4

1 回答 1

1

很难在注释中用代码示例进行讨论。

正如我在 grepcode FragmentStatePagerAdapter.setPrimaryItem() 中看到的,接收objectandroid.support.v4.app.Fragment. 但是ClassCastException当您尝试将对象转换为Fragment. 你能检查一下你的投射:你真的把物体投射到android.support.v4.app.Fragmentnot inandroid.app.Fragment吗?如果没问题,请将您的异常消息添加到您的问题中。

更新:

如果你ScreenSlidePagerAdapter有方法 getCurrentView(),那么你的方法 'getCurrentView()' 可以像这样工作:

public View getCurrentView(ViewPager pager) {
    return ((ScreenSlidePagerAdapter) pager.getAdapter()).getCurrentView();
}

getCurrentView()和你的方法ScreenSlidePagerAdapter

public View getCurrentView() {
    return currView;
}

更新 2:

我对您的代码进行了一些修改:

您使用私人适配器的活动:

public class myActivity extends FragmentActivity implements ISelectItemListener {
    // Your variable declarations and methods

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        final ViewPager pager = (ViewPager) findViewById(R.id.pager);

        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        pager.setAdapter(mPagerAdapter);

        pager.setOnPageChangeListener(
                new OnPageChangeListener() {
                    @Override
                    public void onPageSelected(int pageSelected) {
                        final ScreenSlidePageFragment fragment = mPagerAdapter.getFragment(pageSelected);

                        if (fragment != null) {
                            fragment.doTextViewChnges();
                        }
                    }

                    @Override
                    public void onPageScrollStateChanged(int arg0) {
                        // TODO Auto-generated method stub
                    }

                    @Override
                    public void onPageScrolled(int arg0, float arg1, int arg2) {
                        // TODO Auto-generated method stub
                    }
                });
    }

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        //Your variable declarations

        private final ScreenSlidePageFragment[] mFragments;

        public ScreenSlidePagerAdapter(android.support.v4.app.FragmentManager fm) {
            super(fm);

            mFragments = new ScreenSlidePageFragment[NUM_PAGES];
        }

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




        // It will create new ScreenSlidePageFragment by position if it's not exsist
        @Override
        public android.support.v4.app.Fragment getItem(int position) {
            if (getFragment(position) == null) {
                mFragments[position] = ScreenSlidePageFragment.create(position, <other parameters I want to pass>);
            }

            return getFragment(position);
        }

        // It will give you ScreenSlidePageFragment if it's exists, or null
        public ScreenSlidePageFragment getFragment(int position) {
            return mFragments[position];
        }
    }
}

你的片段:

public class ScreenSlidePageFragment extends Fragment {
    //Your variables and methods

    public static ScreenSlidePageFragment create(int pageNumber, String[] pages, int bookmarkPageNumber, String storyName, int linesInOnePage) {
        final Bundle args = new Bundle();
        args.putInt(ARG_PAGE, pageNumber);
        args.putStringArray(ARG_PAGEARRAY, pages);

        final ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
        fragment.setArguments(args); 

        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPageNumber = getArguments().getInt(ARG_PAGE);
        pages = getArguments().getStringArray(ARG_PAGEARRAY);
    }

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

        loadView(rootView);
        return rootView;
    }

    public int getPageNumber() {
        return mPageNumber;
    }

    // Let's keep logic of modifications in fragment
    public void doTextViewChnges() {
        final View view = getView();
        // do what you want with your View and his children
    }
}
于 2013-05-05T20:21:45.227 回答