2013-02-04 40 views
34

Documents說:Android AdapterView?

當你的佈局的內容是動態的或不預先確定的,你 可以使用該子類適配器視圖來填充版面 ,享有在運行時的佈局。 AdapterView類的子類使用 適配器將數據綁定到其佈局。

但大多數教程是關於ListViewGridViewSpinnerGallery

我期望直接從AdapterView擴展一個子類。我必須創建一個自定義視圖,它的內容依賴於適配器。

我該怎麼做,以及必須重寫哪些方法?

回答

24

首先,您應該確定AdapterView是您想要的,因爲並非所有的「動態或非預定義」視圖都可以通過AdapterView實現。有時你最好創建延伸ViewGroup的視圖。

如果你想使用AdapterView,看看this really nice example。在GitHub上有適配器的很多自定義視圖。 Check out this one (extends ViewGroup)

-1

你可以這樣創造的東西:

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()); 
+3

謝謝,但我的問題不是關於「如何爲視圖創建適配器」,我的問題是關於「如何創建一個定製視圖,它的內容由適配器決定?」(該視圖稱爲「AdapterView ' –

+4

這不是他的@StudentStudent所問的。 – QAMAR

4

ListView延伸AbsListView這又延伸AdapterView<ListAdapter>。所以,如果你絕對必須從頭開始實現這樣一個自定義視圖,你可以看看這些類的源代碼:

但要注意,這是一項相當艱鉅的任務。也許用一個現有的類來調整外觀可能就足夠了。

2

AdapterView派生可以工作,但它可能不會如你所期望的那樣有益。由AdapterView提供的一些基礎設施是包私有的,這意味着我們無法訪問它。

例如,AdapterView管理所選項目索引AbsListViewListView。但是,因爲像setNextSelectedPositionInt(int position)(這是設置mNextSelectedPosition的唯一路徑)的方法是包私有的,所以我們無法找到它們。 AbsListViewListView可以找到他們,因爲他們在同一個包中,但我們不能。

(如果你深入到AdapterView源你會發現setNextSelectedPositionInt()handleDataChanged()調用。不幸的是handleDataChanged()還包私人和爲_not_called從內部AdapterView其他地方可能被利用,使設定位置。)

這意味着如果您需要管理選定的職位,您需要在派生類中重新創建基礎架構(或者您需要從ListViewAbsListView派生出來......儘管我懷疑您會遇到類似的問題來自AbsListView)。這也意味着圍繞物品選擇的任何功能都可能無法完全運作。