Java GreenDroid PagedView-多页(不同布局)帮助。。安卓模拟器

Java GreenDroid PagedView-多页(不同布局)帮助。。安卓模拟器,java,android,class,sdk,Java,Android,Class,Sdk,我花了一整天的时间玩GreenDroid PagedView和PagedAdaptor来创建多个屏幕,人们可以在其中滑动(一种la iPhone风格和Android主屏幕风格)。这是一个非常酷的效果,而且GreenDroid库非常棒。苏。。我可以在一个XML布局(下面的代码)中实现这一点,但我尝试使用三个不同布局的屏幕。我已经尝试过一种方法,并成功地使用了它,但我不确定我使用的方法是否会因为每次方法调用时重复膨胀XML布局而导致问题。我将举一些例子来说明我为节省时间所做的努力。我希望有人读过这篇

我花了一整天的时间玩GreenDroid PagedView和PagedAdaptor来创建多个屏幕,人们可以在其中滑动(一种la iPhone风格和Android主屏幕风格)。这是一个非常酷的效果,而且GreenDroid库非常棒。苏。。我可以在一个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布局主页是一个包含三个文本视图的简单布局。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() */