ViewPager,什么时候加载了子xml文件?

时间:2012-07-07 21:18:21

标签: android

我正在使用本指南来实现ViewPager

http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-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;
}

}

1 个答案:

答案 0 :(得分: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)。

您的PagerAdapter的instantiateItem可能如下所示:

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