Java GreenDroid PagedView-多页(不同布局)帮助。。安卓模拟器
我花了一整天的时间玩GreenDroid PagedView和PagedAdaptor来创建多个屏幕,人们可以在其中滑动(一种la iPhone风格和Android主屏幕风格)。这是一个非常酷的效果,而且GreenDroid库非常棒。苏。。我可以在一个XML布局(下面的代码)中实现这一点,但我尝试使用三个不同布局的屏幕。我已经尝试过一种方法,并成功地使用了它,但我不确定我使用的方法是否会因为每次方法调用时重复膨胀XML布局而导致问题。我将举一些例子来说明我为节省时间所做的努力。我希望有人读过这篇文章,有过GreenDroid的经验,能给我指出正确的方向。也许这也会帮助其他人 这是我的密码: HomePageActivity.javaJava GreenDroid PagedView-多页(不同布局)帮助。。安卓模拟器,java,android,class,sdk,Java,Android,Class,Sdk,我花了一整天的时间玩GreenDroid PagedView和PagedAdaptor来创建多个屏幕,人们可以在其中滑动(一种la iPhone风格和Android主屏幕风格)。这是一个非常酷的效果,而且GreenDroid库非常棒。苏。。我可以在一个XML布局(下面的代码)中实现这一点,但我尝试使用三个不同布局的屏幕。我已经尝试过一种方法,并成功地使用了它,但我不确定我使用的方法是否会因为每次方法调用时重复膨胀XML布局而导致问题。我将举一些例子来说明我为节省时间所做的努力。我希望有人读过这篇
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布局主页是一个包含三个文本视图的简单布局。XML布局视图是这些页面的容器 主页_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" />
这正是我们想要的。每个屏幕都是我想要的不同。我在测试过程中没有注意到任何性能问题,但值得注意的是,在最初的实例中,我们只对布局充气一次。在调用此方法时(每次页面更改时,我们都会再次放大布局。这似乎不是什么好办法,但这是我使用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所说的,继续下一个
有什么想法吗?GreenDroid的
PagedView
通常用于显示一大组页面。它可以被视为一个水平分页的ListView
。这就是为什么使用它与常用的ListAdapter
非常接近的原因
在您的情况下,您希望在内存中保留三个页面。这是完全可能的,但不建议这样做,因为这样会阻止PagedView
回收您的页面,并增加内存中视图的数量
只有3个页面(具有相对平坦和狭窄的视图
层次结构)是可以的。更好的方法是惰性地初始化页面,并在每个页面上保留一个引用
private static final int PAGE_COUNT = 3;
private View[] mPages = new View[PAGE_COUNT];
public View getView(int position, View convertView, ViewGroup parent) {
if (mPages[position] == null) {
View page = createPageAtPosition(position, parent);
mPages[position] = page;
}
return mPages[position];
}
当然,当convertView未被重用时,PagedView
会通知开发人员,您的日志中可能会出现警告。我也遇到了类似的问题。我不确定这是GreenDroid的错误还是我的用户错误。(后者更有可能)
无论如何,这是我提出的解决方案。你的解决方案就快到了,但你在获取现有视图时错过了关键的“其他”条件。它对我来说非常有效
/** get the view to display */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
pageEnum currentPage = pageEnum.values()[position];
if(null == mViews[position]) {
switch(currentPage) {
case PAGE_1:
convertView = getLayoutInflater().inflate(R.layout.page1, parent, false);
break;
case PAGE_2L:
convertView = getLayoutInflater().inflate(R.layout.page2, parent, false);
break;
case PAGE_3:
convertView = getLayoutInflater().inflate(R.layout.page3, parent, false);
break;
default:
convertView = null;
Log.e(TAG, "Invalid page.");
break;
} /* switch(currentPage) */
mViews[position] = convertView;
} /* if(null == mViews[position]) */
else {
convertView = mViews[position];
}
return convertView;
} /* getView() */
/** get the view to display */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
pageEnum currentPage = pageEnum.values()[position];
if(null == mViews[position]) {
switch(currentPage) {
case PAGE_1:
convertView = getLayoutInflater().inflate(R.layout.page1, parent, false);
break;
case PAGE_2L:
convertView = getLayoutInflater().inflate(R.layout.page2, parent, false);
break;
case PAGE_3:
convertView = getLayoutInflater().inflate(R.layout.page3, parent, false);
break;
default:
convertView = null;
Log.e(TAG, "Invalid page.");
break;
} /* switch(currentPage) */
mViews[position] = convertView;
} /* if(null == mViews[position]) */
else {
convertView = mViews[position];
}
return convertView;
} /* getView() */