【问题标题】:How to display different text on each page in ViewPager, instantiateItem() confusionViewPager中如何在每个页面上显示不同的文字,instantiateItem()混淆
【发布时间】:2023-03-18 06:55:02
【问题描述】:

在 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 的行为与预期不同。第一页和第二页具有相同的文本,其余页面按预期具有“锁定”标志。当我滑入第四页并返回第一页时,第一页包含假设在第二页中的文本。我也尝试使用 myViewPager.setOffscreenPageLimit(numberOfPages) 但它没有帮助。

我找到了这个答案:

"instantiateItem里面的position参数是需要渲染的位置,不是用户看到的当前焦点item的位置,当前显示视图左右的页面需要在内存中预渲染,以便这些屏幕的动画流畅。"

这对我来说很有意义,但是我怎样才能正确显示页面内容,然后在需要时对其进行更新?请告知是否有不同的方法可以跳过 instantiateItem() 方法,这会给问题带来混乱和混乱。谢谢。

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

    我已经通过使用不同的实现解决了这个问题:

    // 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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以创建 ViewPager 对象,然后在此对象上设置 Listener。

                     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");
      
              }
          });
      

      【讨论】:

      • 感谢您的回复;然而它并不能解决问题。在我滑动页面之前,我仍然需要一个 instantiateItem() 来第一次显示 TextViews。在 onPageSelected() 之后调用 instantiateItem() 并覆盖它。
      • 不,您可以在为我的项目工作的每个实例上添加 textview
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2017-05-15
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2018-07-16
      相关资源
      最近更新 更多