2011-10-30 40 views
2

我花了一整天的時間玩GreenDroid PagedView和PagedAdaptor創建多個屏幕,可以通過滑動(一個iPhone風格和Android主屏幕風格)。這是一個非常酷的效果,GreenDroid庫非常棒。所以..我可以得到這個工作的一個XML佈局(代碼如下),但我試圖做的是有三個不同的佈局的屏幕。我已經玩過並使用一種方法成功地工作,但我不確定我使用的方法是否會因每次方法調用時XML佈局的重複膨脹而導致問題。我會舉一些我試圖節省時間的例子。我希望有人讀到這個已經有了GreenDroid的經驗,並可以指引我朝着正確的方向發展。也許這也將幫助別人太..GreenDroid PagedView - 多個頁面(不同的佈局)的幫助.. Android SDK

這裏是我的代碼:

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

這按預期工作。每個屏幕都是我想要的。在測試過程中,我沒有注意到任何性能問題,但是在原始實例中,我們只是誇大佈局ONCE值得注意。當這個方法被調用時(每當頁面發生變化時,我們再次膨脹佈局,這似乎並不足夠,但這又是我第一週使用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在班上私人布爾設置=假這背後的考慮是,我們只充氣佈局一次和所有其他調用此方法簡單地返回一個已經膨脹的xml佈局。不幸的是,這使我的模擬器和我的手機(HTC EVO 3D)崩潰。正如Jay-Z所說,在下一個...

任何想法傢伙?

回答

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不重用。

1

我遇到了類似的問題。不知道這是一個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() */