bon bon
bon bon

Reputation: 141

How to solve this weird issue of viewpager?

I have a viewpager with each page contain a number

Example:

page 1 contain textview with text "1"

page 2 contain textview with text "2"

......add 20 more

Then I get text by:

        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                    @Override
                    public void onPageSelected(int arg0) {
                        // TODO Auto-generated method stub

                                TextView myText= adapter.getTextView();
                                CharSequence charSequence = dateArea.getText();
                                String dateString = charSequence.toString();
                                Log.e("TEST1", dateString);

                    }
}

When I slide 1 way (right or left),it shows the text correctly. But when I slide 2 way, the problem appear:

Example:

I slide left ( start from 10 ), the result is 9 (correct).

Then I slide right, the result is still 9 (it should be 10).

Then I slide left again, the result is 9. At this point,if I slide left one more time, it will show correct result which is 8. Please show me how to fix this!

EDIT:

    public class ViewPagerAdapter extends PagerAdapter {
        Context context;
        LayoutInflater inflater;
        String[] listNumber;
        TextView textView;

        public ViewPagerAdapter(Context context, String[] listNumber) {
            this.context = context;
            this.listNumber= listNumber;
        }

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

        @Override
        public Object instantiateItem(final ViewGroup container, final int position) {
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View itemView = inflater.inflate(R.layout.viewpager_adapter, container, false);
            textView= (TextView) itemView.findViewById(R.id.textView);
            textView.setText(listNumber[position]);

            ((ViewPager) container).addView(itemView);
            return itemView;

        }

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

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return listNumber.length;
        }

        public TextView getTextView() {
            return textView;
        }
    }

Upvotes: 2

Views: 67

Answers (1)

W3hri
W3hri

Reputation: 1591

First, change your adapter to this by making the TextView local:

@Override
    public Object instantiateItem(final ViewGroup container, final int position) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.viewpager_adapter, container, false);
        Textview textView= (TextView) itemView.findViewById(R.id.textView);
        textView.setText(listNumber[position]);
        textView.setTag("tv"+position);

        ((ViewPager) container).addView(itemView);
        return itemView;

    }

Then, you can get the textview on pagechange by using the following snippet. The adapter.getTextView() is not necessary anymore.

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int arg0) {
            // TODO Auto-generated method stub

            TextView myText= (TextView) mViewPager.findViewWithTag("tv"+ arg0);
            mText.setText(dateString);

            CharSequence charSequence = dateArea.getText();
            String dateString = charSequence.toString();
            Log.e("TEST1", dateString);

        }
    }

Upvotes: 1

Related Questions