0

我使用本指南来实现ViewPager

http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizo​​ntal-view-paging/

这是我的main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp"
android:background="@drawable/gradientbg" >

 <android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewPager"/>

</LinearLayout>

我的主要活动:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
setContentView(R.layout.main);

MyPagerAdapter adapter = new MyPagerAdapter();
    ViewPager myPager = (ViewPager)findViewById(R.id.viewPager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(1);

    //textviews and other controls that arent located in main.xml will be null for a couple of seconds here

viewpager 使用 2 个子 xml 文件作为可滚动内容。我如何知道 viewpager 何时完成以便我可以使用子控件,例如 textviews 等?

希望你明白这个想法,否则会详细说明。提前致谢!

public class MyPagerAdapter extends PagerAdapter {

public int getCount() {
    return 2;
}

public Object instantiateItem(View collection, int position) {

    LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    int resId = 0;
    switch (position) {
    case 0:
        resId = R.layout.debug;
        break;
    case 1:
        resId = R.layout.home;
        break;
    }

    View view = inflater.inflate(resId, null);

    ((ViewPager) collection).addView(view, 0);

    return view;
}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
    ((ViewPager) arg0).removeView((View) arg2);

}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == ((View) arg1);

}

@Override
public Parcelable saveState() {
    return null;
}

}
4

1 回答 1

0

在这种情况下,我更喜欢编写一个自定义View实现,该实现保留对其子项的引用,这些子项在创建时被初始化。(我经常为此使用内部静态类。)这有助于保持模块化。

例如:

public class MyView {
  private TextView myTextView;
  private ListView myListView;

  public MyView(Context context) {
    super(context);
    LayoutInflater.from(context).inflate(R.layout.my_layout, this, true);
    myTextView = (TextView) findViewById(R.id.my_textview);
    myListView = (TextView) findViewById(R.id.my_listview);
  }
}

你得到了演习。现在你可以有这样的setText(String)方法:

  public void setText(String text) {
    myTextView.setText(text);
  }

在您的情况下,您将创建两个这样的视图类,一个HomeView和一个DebugView(或其他)。

您可以预先创建所需的实例,如果 ViewPager 预先缓存了这两个实例,这似乎是合理的,或者您可以按需创建它们。

第一种情况(急切的实例化)可能如下所示:

private HomeView homeView;
private DebugView debugView;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    homeView = new HomeView(getContext());
    debugView = new DebugView(getContext());

    MyPagerAdapter adapter = new MyPagerAdapter();
    ViewPager myPager = (ViewPager)findViewById(R.id.viewPager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(1);
}

您在自定义 View 类的构造函数中执行所有需要的初始化,并根据需要传递所需的信息(和/或可能的savedInstanceState)。

然后您的 PagerAdapterinstantiateItem可能如下所示:

public Object instantiateItem(ViewGroup container, int position) {

    final View view;
    switch (position) {
    case 0:
       view = debugView;
       break;
    case 1:
       view = homeView;
       break;
    default:
       throw new IllegalStateException("Should not happen");
    }

    container.addView(view, 0);

    return view;
}

(您不想使用该instantiateItem(View, int)方法,它已被弃用且不方便。)

如果您想按需实例化您的视图,您可以将构造函数调用移动到适配器中,然后您必须null在访问视图时检查值。

如果您负担得起以 API 13 及更高版本为目标,您可能希望改用FragmentPagerAdapter


为了让事情看起来更好,如果你想要一个 PagerAdapter 只提供非常有限数量的预先创建的视图(你真的只想要它是一个非常小的数字,比如 2),你可以这样写:

public class ArrayPagerAdapter extends PagerAdapter {

  private final View[] mViews;

  public ArrayPagerAdapter(View... views) {
      mViews = views;
  }

  @Override
  public int getCount() {
      return mViews.length;
  }

  @Override
  public Object instantiateItem(ViewGroup container, int position) {
      final View view = mViews[position]

      container.addView(view);

      return view;
  }

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

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

}

然后您可以使用它来实例化

PagerAdapter adapter = new ArrayPagerAdapter(debugView, homeView);
于 2012-07-07T22:31:21.310 回答