我需要將自定義按鈕對象添加到ListView中的每一行。這裏有一個簡單的行佈局:如何判斷多個getView結果中的哪一個可見?
<LinearLayout android:id="@+id/table_cell"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView android:id="@+id/label"
android:textSize="19dp"
android:textStyle="bold"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:lines="1"
/>
<LinearLayout android:id="@+id/button_wrapper"
android:layout_width="100dp"
android:layout_height="match_parent"
/>
</LinearLayout>
在我的自定義ArrayAdapter,我把按鈕進入getView()電池:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// recycle the cell if possible
View cell = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
cell = inflater.inflate(R.layout.table_cell, parent, false);
} else {
cell = convertView;
}
MyButton button = (MyButton) this.buttons.get(position);
if (button != null) {
// remove the button from the previous instance of this cell
ViewGroup parent = (ViewGroup)button.getParent();
if (parent != null) {
parent.removeView(button);
}
// add the button to the new instance of this cell
ViewGroup buttonWrapper = (ViewGroup)cell.findViewById(R.id.button_wrapper);
buttonWrapper.addView(button);
}
}
我知道getView()被調用多次爲每個表當我滾動表格或單擊按鈕或做其他事情時,上面的代碼會將按鈕從前一個視圖中刪除,然後再將其添加到新視圖中以避免「視圖已有父項」異常。
的問題是,這是假定從getView生成的最新觀點是,在屏幕上是可見的,但情況往往並非如此。有時getView()會生成新的視圖,但屏幕上會保留一個較舊的視圖。在這種情況下,我的按鈕會消失,因爲getView()會將其移動到不可見的新視圖。我發現,行爲通過初始化命名repeatRowTest
一個int變量,然後將裏面getView()這樣的代碼:
if (position == 0) {
Log.d("getView", "repeat row count: " + repeatRowCountTest);
TextView label = (TextView)cell.findViewById(R.id.label);
label.setText(String.format("%d %s", repeatRowCountTest, label.getText()));
repeatRowCountTest++;
}
這說明我有多少次給定行已經生成,並實例當前顯示。我可能會看到一行產生了10次,而僅顯示了第5行。但是,如果顯示行的最新實例,我的按鈕纔會顯示。
所以,問題是,我怎麼能告訴是否getView()實際上是將要顯示的,所以我知道是否將我的按鈕進去,還是離開我的按鈕,它是產生一排?或者更一般地說,我怎麼可以添加一個按鈕到一行,並確保它保持可見,因爲getView重複給定的位置?
我檢查所顯示的行的所有特性與一個額外的,不顯示行,找不到任何差別。我也嘗試在按鈕消失後調用數組適配器上的notifyDataSetChanged,並使用包含按鈕的所有最新視圖刷新列表 - 但不清楚哪些事件觸發getView重複自身,所以我不知道當我需要調用notifyDataSetChanged以使事情再次正確。我想我可以克隆按鈕併爲該行的每個新實例添加一個新的按鈕實例,但似乎比必要的資源密集程度更高,並且會產生其他問題,因爲其他對象具有對這些按鈕的引用。我還沒有找到任何代碼示例顯示了實現此目的的最佳方式,但它似乎是一個常見要求,所以希望我錯過了一些簡單的東西!
UPDATE:是否有一個ArrayAdapter我可以覆蓋的getView()方法被調用後調用的方法?如果是這樣,我可以檢查所有最近創建的行的父項,以查看它們是否實際顯示在ListView中,如果不是,則刷新ListView。
只需在一行或兩行清除您的需求。 – 2014-11-05 09:15:20