【发布时间】:2011-10-30 08:52:05
【问题描述】:
我整天都在玩弄 GreenDroid PagedView 和 PagedAdaptor 来创建多个可以滑动浏览的屏幕(类似于 iPhone 风格和 Android 主屏幕风格)。这是一个非常酷的效果,GreenDroid 库很棒。 Soo .. 我可以让这个工作适用于一个 XML 布局(下面的代码),但我试图做的是拥有三个具有不同布局的屏幕。我已经尝试过并使用一种方法成功地工作,但我不确定我正在使用的方法是否会由于每次方法调用时 XML 布局的重复膨胀而导致问题。我将举一些例子来说明我为节省时间所做的努力。我希望有人读过这个有过 GreenDroid 经验的人,可以为我指明正确的方向。也许这也会对其他人有所帮助..
这是我的代码:
HomePageActivity.java
public class HomePageActivity extends GDActivity {
private static final int PAGE_COUNT = 3;
private final Handler mHandler = new Handler();
private PageIndicator mPageIndicator;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setActionBarContentView(R.layout.homepage_view); // container xml
final PagedView pagedView = (PagedView) findViewById(R.id.homepage_view);
pagedView.setOnPageChangeListener(mOnPagedViewChangedListener);
pagedView.setAdapter(new HomePageAdapter());
mPageIndicator = (PageIndicator) findViewById(R.id.page_indicator);
mPageIndicator.setDotCount(PAGE_COUNT);
setActivePage(pagedView.getCurrentPage());
}
private void setActivePage(int page) {
mPageIndicator.setActiveDot(page);
}
private OnPagedViewChangeListener mOnPagedViewChangedListener = new OnPagedViewChangeListener() {
@Override
public void onStopTracking(PagedView pagedView) {
}
@Override
public void onStartTracking(PagedView pagedView) {
}
@Override
public void onPageChanged(PagedView pagedView, int previousPage, int newPage) {
setActivePage(newPage);
}
};
private class HomePageAdapter extends PagedAdapter {
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
Log.i("getView","ConvertView is null");
convertView = getLayoutInflater().inflate(R.layout.homepage_one, parent, false);
}
Log.i("getView Page",Integer.toString(position));
return convertView;
}
}
两行:
Log.i("getView","ConvertView is null");
Log.i("getView Page",Integer.toString(position));
我正在使用它来调试它以查看发生了什么。 LogCat 等我可以进行实验。
第一行显示一次 - 首次创建应用程序。我注意到当我浏览页面时非常非常偶尔(我有三个 - 由顶部的变量 PAGE_COUNT 设置),在 30-50 次滑动后我会再次看到此消息。这表明此布局仅充气一次 - 对于所有屏幕。
我每次换页时自然会看到第二行。在这种特殊情况下,整数位置是 0、1 或 2。
XML 布局 homepage_one 是一个包含三个 TextView 的简单布局。 XML 布局 homepage_view 是这些页面的容器。
homepage_view.xml
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:greendroid="http://schemas.android.com/apk/res/com.cyrilmottier.android.gdcatalog">
<greendroid.widget.PagedView
android:id="@+id/homepage_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/splash" />
<greendroid.widget.PageIndicator
android:id="@+id/page_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|center_horizontal"
android:paddingTop="10dp" />
我自然尝试了一些明显的方法,例如:(按要求工作)
public View getView(int position, View convertView, ViewGroup parent) {
if (position == 0) {
convertView = getLayoutInflater().inflate(R.layout.homepage_one, parent, false);
} else if( position == 1 ){
convertView = getLayoutInflater().inflate(R.layout.homepage_two, parent, false);
} else {
convertView = getLayoutInflater().inflate(R.layout.homepage_three, parent, false);
}
return convertView;
}
这按预期工作。每个屏幕都是我想要的不同。在测试过程中我没有注意到任何性能问题,但值得注意的是在原始实例中我们只膨胀了一次布局。由于调用了此方法(每次页面更改时,我们都会再次膨胀布局。这似乎并不资源,但是这又是我进行 Android 开发的第一周,我不知道架构是如何工作的.. .(只是阅读、阅读、阅读和测试、测试、测试)- 所以我想听听更有经验和知识渊博的开发人员的意见。这很可能是可以接受的。我想听听你的意见。
我试过了:
public View getView(int position, View convertView, ViewGroup parent) {
if (PAGE_ONE == false && position == 0) {
convertView = getLayoutInflater().inflate(R.layout.homepage_one, parent, false);
PAGE_ONE = true;
} else if(PAGE_TWO == false && position == 1 ){
convertView = getLayoutInflater().inflate(R.layout.homepage_two, parent, false);
PAGE_TWO = true;
} else if( PAGE_THREE == false && position == 2 ){
convertView = getLayoutInflater().inflate(R.layout.homepage_three,parent, false);
PAGE_THREE = true;
}
return convertView;
}
PAGE_ONE、PAGE_TWO、PAGE_THREE 在类中设置为 private boolean = false。这背后的考虑是我们只膨胀一次布局,并且对这个方法的所有其他调用都只是返回已经膨胀的 xml 布局。不幸的是,这使我的模拟器和手机(HTC EVO 3D)崩溃。正如 Jay-Z 所说,继续下一个......
有什么想法吗?
【问题讨论】: