gpt4 book ai didi

java - GreenDroid PagedView - 多页(不同布局)帮助.. Android SDK

转载 作者:行者123 更新时间:2023-11-30 09:44:21 26 4
gpt4 key购买 nike

我花了一整天时间使用 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 次滑动后我会再次看到此消息。这表明此布局仅 INFLATED 一次 - 对于所有屏幕。

第二行我每次换页时自然会看到。在此特定情况下,整数位置为 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 所说,进入下一个......

有什么想法吗?

最佳答案

GreenDroid 的PagedView 通常用于显示大量页面。它可以被认为是一个水平分页的 ListView。这就是为什么使用它非常接近于常见的 ListAdapter 的原因。

在您的例子中,您希望在内存中保留三个页面。这是完全可能的,但不推荐这样做,因为您会阻止 PagedView 回收您的页面,并且还会增加内存中 View 的数量。

只有 3 个页面(具有相对平坦和狭窄的 View 层次结构)就可以了。一种更好的方法是延迟初始化页面并在每个页面上保留一个引用。

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];
}

当然,您的日志中可能会有警告,因为 PagedView 会在 convertView 未被重用时通知开发人员。

关于java - GreenDroid PagedView - 多页(不同布局)帮助.. Android SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7944032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com