0

I'm simply trying to iterate through the pages that I created with a ViewPager. Each page has a textview that I need to get the value of. I can get the current fragment, but I need to be able to specify the pages in my for loop, like this:

public void setEntryValues() {

        int numPages = mAdapter.getCount();

        JournalEntryFragment frag;
        View view;
        TextView txtView;

        for(int i = 0; i < numPages; i++) {

            frag = (JournalEntryFragment)mAdapter.instantiateItem(mPager,mPager.getCurrentItem());

            //frag = (JournalEntryFragment)mAdapter.getItem(i); // Doesn't work, returns null for view


            view = frag.getView();
            txtView = (TextView)view.findViewById(R.id.scale);
            int scale = Integer.valueOf(txtView.getText().toString());

            Log.v("rx", "scale: " + scale);

            if(i == 0) {
                mEntry.setPain(scale);
            } else if(i ==1) {
                mEntry.setStress(scale);
            } else {
                mEntry.setSleep(scale);
            }

            Log.v("rx", mEntry.toString());


        }


    }

getCurrentItem() works fine, but only for the current slide. When I try getItem(), I always get a null for the view.

/* Update - Here is my FragmentPagerAdapter */

public class JournalPagerAdapter extends FragmentPagerAdapter {

    public JournalPagerAdapter(FragmentManager mgr) {
        super(mgr);
    }
    @Override
    public int getCount() {
        return(3);
    }
    @Override
    public Fragment getItem(int position) {
        return(JournalEntryFragment.newInstance(position));
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return super.getPageTitle(position);
    }

    @Override
    public int getItemPosition(Object object) {
        return super.getItemPosition(object);
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }

}
jwBurnside
  • 849
  • 4
  • 31
  • 66

1 Answers1

1

I think you are trying to retrieve information from a viewpager adapter on a swipe and also you are trying to instantiate an item by looping. You may find this solution a little different than what you have asked for. But I am going to write it anyway.

Here is how you can write your PagerAdapter,

public class ViewPagerAdapter extends PagerAdapter {

    Context context;
    LayoutInflater inflater;
    ArrayList<Item> itemsList = new ArrayList<Item>();

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((RelativeLayout) object);
    }

    public ViewPagerAdapter(Context context, ArrayList<Item> items) {
        this.context = context;
        itemsList = items;
    }

    /**
     * This method returns the number of views to be displayed.
     */
    @Override
    public int getCount() {
        return itemsList.size();
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        TextView txtMessage;
        TextView txtHeading;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View viewItem = inflater.inflate(R.layout.viewpagercontent, container, false);
        txtHeading = (TextView) viewItem.findViewById(R.id.txtHeadline);
        txtMessage = (TextView) viewItem.findViewById(R.id.txtMsg);

        container.addView(viewItem);
        return viewItem;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((RelativeLayout) object);
    }
}

If you want to retrieve a piece of an information on a certain event (lets say you are swiping on a ViewPager), you can do the following,

    viewPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int pPosition) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageScrolled(int pPosition, float pPositionOffset, int pPositionOffsetPixels) {
            // TODO Auto-generated method stub

        }

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

        }
    });
}

Hope it helps you.

Ahmed
  • 2,966
  • 7
  • 42
  • 69
  • I used instantiateItem because for some reason mAdapter.getItem() doesn't want to return the view. I have updated the code with my adapter. – jwBurnside Apr 03 '14 at 19:59
  • Yes, looks like this worked, thanks. I didn't realize this was a duplicate, took me a minute to find, but there is also a good answer here: http://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-a-viewpager – jwBurnside Apr 04 '14 at 17:22