我正在使用本指南来实现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;
}
}
答案 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);