1

ViewPagerのCustomPagerAdapterで、instantiateItem()メソッドでTextViewを作成しようとしています。次に、特定の条件に応じて、ページごとに異なるテキストを設定します。テキストはページカーソルから読み取られます。コードは次のとおりです。

@Override
public Object instantiateItem(ViewGroup collection, int position) {

sc = new ScrollView(context);
sc.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
sc.setFillViewport(true);
tv = new TextView(context);


if(position < count) {
  tv.setText(pages.getString(1));   
  pages.moveToPosition(position);

}else {
  tv.setText("LOCKED");
}          

  tv.setTag(TAG_PAGE + position);

  tv.setGravity(Gravity.CENTER);
  tv.setTextColor(Color.BLACK);
  tv.setTextSize(30);
  sc.addView(tv);

  ((ViewPager) collection).addView(sc);

  return sc;            
}

ただし、ViewPagerは期待どおりに動作しません。1ページ目と2ページ目は同じテキストで、残りのページには予想どおり「LOCKED」の記号が付いています。4ページ目にスワイプして最初のページに戻ると、最初のページは2番目のページにあると思われるテキストで構成されています。myViewPager.setOffscreenPageLimit(numberOfPages)も使用しようとしましたが、役に立ちません。

私はこの答えを見つけました:

「instantiateItem内では、positionパラメーターはレンダリングが必要な位置です。ユーザーに表示される現在フォーカスされているアイテムの位置ではありません。現在表示されているビューの左右のページは事前に設定する必要があります。これらの画面へのアニメーションがスムーズになるように、メモリにレンダリングされます。」

それは私には理にかなっていますが、ページのコンテンツを正しく表示し、必要に応じて更新するにはどうすればよいですか?問題に混乱と混乱をもたらすinstantiateItem()メソッドをスキップしてそれを行う別の方法があるかどうかアドバイスしてください。ありがとうございました。

4

2 に答える 2

2

別の実装を使用して、この問題を解決しました。

// Adapter class
private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm)   {
    super(fm);
}

@Override
public Fragment getItem(int index) {
    return PageFragment.newInstance(pages[index]);  // Pages is an array of Strings
    }

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


// PageFragment class
public class PageFragment extends Fragment {

TextView tv;

public static PageFragment newInstance(String page) {
    PageFragment pageFragment = new PageFragment();
    Bundle bundle = new Bundle();
    bundle.putString("pageContent", page);
    pageFragment.setArguments(bundle);

    return pageFragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)   {
    View view = inflater.inflate(R.layout.fragment, container, false);
    tv = (TextView) view.findViewById(R.id.text_view);
    tv.setText(getArguments().getString("pageContent"));

    return view;
    }
}
于 2012-12-14T21:09:42.240 に答える
0

ViewPagerオブジェクトを作成してから、このオブジェクトにリスナーを設定できます。

               ViewPager myPager = (ViewPager) findViewById(R.id.yourPagerid);
            myPager.setAdapter(adapter);
                 myPager.setCurrentItem(0);

                    myPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
                      //You can change textview word according to current page

            switch (position) {
            case 0:

                break;
            case 1:

                break;
            case 2:

                break;
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // Log.d("check","onPageScrolled");

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // Log.d("check","onPageScrollStateChanged");

        }
    });
于 2012-12-14T18:07:45.450 に答える