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

标签 java android class sdk

我花了一整天时间使用 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/

相关文章:

java - Java 中 '\f' char 的替代方法是什么?

java - JUnit 假设失败 理论

java - 从java中的对象获取类列表

class - 为什么一个类可以实现多个接口(interface)?

java - 在java中传递类对象

java - 将新主机添加到 apache ignite 数据网格

java - 在java中断言两个具有有限属性的实例

java - 用 Activity 组内的另一个 fragment 替换 fragment

android - 为什么一些 SQLite 方法期望参数为 Object[] 而其他方法需要 String[]?

android - 用于向 android google map 添加标记的异步任务被卡住