2015-10-18 206 views
1

我想實現一個特殊的自定義視圖,有很多子視圖,我需要實現垂直滾動。Android - 滾動大量的項目沒有滾動視圖/列表視圖/ Gridview

基於ScrollView的方法太慢,因爲太多的孩子不能繪製。我無法啓用硬件層,因爲滾動內容的長度太長,無法適應HWUI的紋理大小。軟件層也失敗,內存不足以創建如此大的圖層。

我不能使用列表視圖& Gridview無論是與項目有關的問題。 因此,我認爲我將自己創建listview類似的功能。

我知道爲此,我必須重新使用視圖。 這裏是我如何進行混亂。當內容滾動時,我可以從頂端進行查看並將其移至底部。 我認爲有3種方法可以做到這一點。
1] setTranslateY
2] offsetTopAndBottom
3]變化layoutparams頂部和底部邊緣,並呼籲requestLayout

但是,我不知道怎麼有不同的特別是[1] [2]。 有沒有人可以告訴我[1]和[2]是如何不同的,並指導我如何實現listview這個正確的方法,就像滾動大量的項目一樣。

謝謝, Androbean。

+0

''我知道爲此,我必須重新使用視圖「'所以使用'RecyclerView'。 docs:「Class Overview 一個靈活的視圖,用於爲大型數據集提供有限的窗口。」 – pskink

+0

我認爲Recyclerview也不能使用,因爲子項目不完全是垂直列表。我把孩子的觀點排列成一個交錯的網格。 :( –

+0

請參閱[RecyclerView.LayoutManager](https://developer.android.com/reference/android/support/v7/widget/RecyclerView.LayoutManager.html) – pskink

回答

0

RecyclerView.LayoutManager似乎是一個可能的解決方案。但在這個時候改變我的設計非常困難,以符合RecyclerView.LayoutManager的方法。

因此,我制定了一項適合自己的工作。滾動是非常順利的,我不必改變很多代碼。 張貼在這裏爲我自己和其他人蔘考。

基本上我創建所有的子視圖,並將它們添加到我的自定義Viewgroup中。但是,我重寫了dispatchDraw方法將繪圖限制爲僅可見的那些。

此處不使用回收方法。這只是一個巨大的Viewgroup包裹在Scrollview中。

@Override 
protected void dispatchDraw(Canvas canvas) { 
    int clipSaveCount = canvas.save(); 
    canvas.clipRect(getScrollX() + getPaddingLeft(), getScrollY() + getPaddingTop(), 
      getScrollX() + getRight() - getLeft() - getPaddingRight(), 
      getScrollY() + getBottom() - getTop() - getPaddingBottom()); 

    int rowHeightNoGap = (getHeight() - getPaddingTop() - getPaddingBottom())/mDataScreen.getRowCount(); 
    int startIndex = Math.max(0, (mScrollPosY - getPaddingTop())/rowHeightNoGap * mDataScreen.getColumnCount()-1); 
    int endIndex = Math.min(getChildCount()-1, startIndex + (mDataScreen.getVisibleRowCount()+1) * mDataScreen.getColumnCount()); 

    final long drawingTime = getDrawingTime(); 
    for (int i = startIndex; i <= endIndex; i++) { 
     drawChild(canvas, getChildAt(i), drawingTime); 
    } 

    canvas.restoreToCount(clipSaveCount); 
} 

int mScrollPosY; 
public void setScrollPosition(int scrollPosY){ 
    mScrollPosY = scrollPosY; 
    invalidate(); 
} 
+0

你在這裏修改哪個班級? – ataulm

+0

@ataulm這是包裝在Scrollview中的ViewGroup的子類。 –

+0

所以這不會做任何視圖回收?如果您可以更新您的答案以明確說明,那就太好了,正如您所提到的,您希望在您的問題中查看回收。 – ataulm