2011-12-24 31 views
0

我有一個自定義的ListView類(從ListView中分類),我需要它添加一個小填充到最終視圖元素的底部,這樣它就不會與我所跨過的小酒吧重疊屏幕的底部。我只想在子視圖越過listview的可見區域時執行此操作。我想利用這個代碼來實現這一目標:ListView getFirstVisiblePosition getFirstVisiblePosition getCount values

@Override 
protected void onLayout (boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 

    // If there are hidden listview items we need to add a small padding to the last one so that it 
    // partially hidden by the bottom sliding drawer handle 
    if (this.getLastVisiblePosition() - this.getFirstVisiblePosition() + 1 > this.getCount()) { 
     LinearLayout v2 = (LinearLayout) this.getChildAt(this.getCount() - 1); 
     v2.setPadding(v2.getPaddingLeft(), v2.getPaddingTop(), v2.getPaddingRight(), 
       v2.getPaddingBottom() + 5); 
    } 
} 

然而,getLastVisiblePostion(),getFirstVisiblePostion()和getCount將()返回的值反映不出什麼適配器持有呢。我假設這是因爲適配器尚未通知數據的ListView,但我無法弄清楚ListView實際知道數據的位置,因此具有正確的值。該代碼正在加載活動時運行。

在渲染過程的哪個點我可以訪問這些數據?我還應該說,我使用AsyncTask從數據庫加載數據,然後在那裏創建Adapter並將其添加到列表視圖。是否有一個事件可以在ListView中使用,當適配器添加數據時會觸發事件/導致列表視圖呈現新項目?

回答

0

我不知道這是否是最好的解決辦法,但我知道,在上拉來刷新執行鍼對Android的分支之一,該列表的高度對所有列表的總高度相比,項目。從你所說的話來看,這聽起來就是你想要確定是否應用額外填充的信息。

實施的相關部分在以下三種方法:

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if (mHeight == -1) { // do it only once 
     mHeight = getHeight(); // getHeight only returns useful data after first onDraw() 
     adaptFooterHeight(); 
    } 
} 

/** 
* Adapts the height of the footer view. 
*/ 
private void adaptFooterHeight() { 
    int itemHeight = getTotalItemHeight(); 
    int footerAndHeaderSize = mFooterView.getHeight() 
     + (mRefreshViewHeight - mRefreshOriginalTopPadding); 
    int actualItemsSize = itemHeight - footerAndHeaderSize; 
    if (mHeight < actualItemsSize) { 
     mFooterView.setHeight(0); 
    } else { 
     int h = mHeight - actualItemsSize; 
     mFooterView.setHeight(h); 
     setSelection(1); 
    } 
} 

/** 
* Calculates the combined height of all items in the adapter. 
* 
* Modified from http://iserveandroid.blogspot.com/2011/06/how-to-calculate-lsitviews-total.html 
* 
* @return 
*/ 
private int getTotalItemHeight() { 
    ListAdapter adapter = getAdapter(); 
    int listviewElementsheight = 0; 
    for(int i =0; i < adapter.getCount(); i++) { 
     View mView = adapter.getView(i, null, this); 
     mView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
     listviewElementsheight+= mView.getMeasuredHeight(); 
    } 
    return listviewElementsheight; 
} 

完整的源代碼可以在GitHub上找到here

+0

感謝您的回覆,但仍然有同樣的問題。我認爲問題在於,當onLayout被調用時,適配器尚未告知有關項目的視圖。當添加這些數據時,是否有某種類型的數據可以插入? – 2011-12-25 05:49:51

+0

當您在ListView上設置適配器時,您是否嘗試將'mHeight'設置回'-1'?從它聽起來,你第一次繪製完成後填充列表的方式,這意味着計算出的高度可能是'0',並且在您實際設置數據時不準確。因此你需要更新它。據我所知,沒有特定的事件可以使用。如果是這樣,上述代碼中的解決方法將不是必需的。 – 2011-12-25 06:09:40

0

我也有類似的問題,當getFirstVisiblePosition()返回的數字比getCount()更大。
通過調用listView.setAdapter(listView.getAdapter())來修復它。

相關問題