【问题标题】:GreenDroid PagedView - Multiple pages (different layout) help.. Android SDKGreenDroid PagedView - 多页(不同布局)帮助.. Android SDK
【发布时间】: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 所说,继续下一个......

有什么想法吗?

【问题讨论】:

    标签: java android class sdk


    【解决方案1】:

    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 时会通知开发人员。

    【讨论】:

      【解决方案2】:

      我也遇到了类似的问题。不确定这是否是 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() */
      

      【讨论】:

        猜你喜欢
        • 2011-07-25
        • 2011-08-15
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        相关资源
        最近更新 更多