Documents說:Android AdapterView?
當你的佈局的內容是動態的或不預先確定的,你 可以使用該子類適配器視圖來填充版面 ,享有在運行時的佈局。 AdapterView類的子類使用 適配器將數據綁定到其佈局。
但大多數教程是關於ListView
,GridView
,Spinner
和Gallery
。
我期望直接從AdapterView
擴展一個子類。我必須創建一個自定義視圖,它的內容依賴於適配器。
我該怎麼做,以及必須重寫哪些方法?
Documents說:Android AdapterView?
當你的佈局的內容是動態的或不預先確定的,你 可以使用該子類適配器視圖來填充版面 ,享有在運行時的佈局。 AdapterView類的子類使用 適配器將數據綁定到其佈局。
但大多數教程是關於ListView
,GridView
,Spinner
和Gallery
。
我期望直接從AdapterView
擴展一個子類。我必須創建一個自定義視圖,它的內容依賴於適配器。
我該怎麼做,以及必須重寫哪些方法?
首先,您應該確定AdapterView
是您想要的,因爲並非所有的「動態或非預定義」視圖都可以通過AdapterView
實現。有時你最好創建延伸ViewGroup
的視圖。
如果你想使用AdapterView
,看看this really nice example。在GitHub上有適配器的很多自定義視圖。 Check out this one (extends ViewGroup
)。
你可以這樣創造的東西:
public class SampleAdapter extends BaseAdapter {
public SampleAdapter() {
// Some constructor
}
public int getCount() {
return count; // Could also be a constant. This indicates the # of times the getView gets invoked.
}
public Object getItem(int position) {
return position; // Returns the position of the current item in the iteration
}
public long getItemId(int position) {
return GridView.INVALID_ROW_ID;
}
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.some_layout, null);
view.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
view.setBackgroungColor(Color.RED);
return view;
}
}
這可能是調用,如:
GridView sampleView = (GridView) linearLayout.findViewById(R.id.sample_layout);
sampleView.setAdapter(new SampleAdapter());
ListView
延伸AbsListView
這又延伸AdapterView<ListAdapter>
。所以,如果你絕對必須從頭開始實現這樣一個自定義視圖,你可以看看這些類的源代碼:
但要注意,這是一項相當艱鉅的任務。也許用一個現有的類來調整外觀可能就足夠了。
這可能不是一個總的回答你的問題,但我向您展示最有可能的出發點或指針,可以指導:
從AdapterView
派生可以工作,但它可能不會如你所期望的那樣有益。由AdapterView
提供的一些基礎設施是包私有的,這意味着我們無法訪問它。
例如,AdapterView
管理所選項目索引AbsListView
和ListView
。但是,因爲像setNextSelectedPositionInt(int position)
(這是設置mNextSelectedPosition
的唯一路徑)的方法是包私有的,所以我們無法找到它們。 AbsListView
和ListView
可以找到他們,因爲他們在同一個包中,但我們不能。
(如果你深入到AdapterView
源你會發現setNextSelectedPositionInt()
從handleDataChanged()
調用。不幸的是handleDataChanged()
還包私人和爲_not_called
從內部AdapterView
其他地方可能被利用,使設定位置。)
這意味着如果您需要管理選定的職位,您需要在派生類中重新創建基礎架構(或者您需要從ListView
或AbsListView
派生出來......儘管我懷疑您會遇到類似的問題來自AbsListView
)。這也意味着圍繞物品選擇的任何功能都可能無法完全運作。
謝謝,但我的問題不是關於「如何爲視圖創建適配器」,我的問題是關於「如何創建一個定製視圖,它的內容由適配器決定?」(該視圖稱爲「AdapterView ' –
這不是他的@StudentStudent所問的。 – QAMAR