編輯:Android開發教程
對於ListView、GridView、Gallery、Spinner等等,它是它們的適配器,直接繼承自接口類Adapter的,使用BaseAdapter時需要重寫很多方法,其中最重要的當屬getView,因為這會涉及到ListView優化等問題,BaseAdapter與其他Adapter有些不一樣,其他的Adapter可以直接在其構造方法中進行數據的設置:
SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.list_item, new String[]{"img","title","info",newint[]{R.id.img, R.id.title, R.id.info}});
但是在BaseAdapter中需要實現一個繼承自BaseAdapter的類,並且重寫裡面的很多方法:
class MyAdapter extends BaseAdapter { private Context context; public MyAdapter(Context context) { this.context = context; } @Override public int getCount() { // How many items are in the data set represented by this Adapter.(在此適配器中所代表的數據集中的條目數) return 0; } @Override public Object getItem(int position) { // Get the data item associated with the specified position in the data set.(獲取數據集中與指定索引對應的數據項) return null; } @Override public long getItemId(int position) { // Get the row id associated with the specified position in the list.(取在列表中與指定索引對應的行id) // 查看本欄目更多精彩內容:http://www.bianceng.cn/OS/extra/ return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // Get a View that displays the data at the specified position in the data set. return null; } }
沒有任何處理,不建議這樣寫。
如果數據量少看將就,但是如果列表項數據量很大的時候,會每次都重新創建View,設置資源,嚴重影響性能,所以從一開始就不要用這種方式。
@Override public View getView(int position, View convertView, ViewGroup parent) { View item = mInflater.inflate(R.layout.list_item, null); ImageView img = (ImageView)item.findViewById(R.id.img) TextView title = (TextView)item.findViewById(R.id.title); TextView info = (TextView)item.findViewById(R.id.info); img.setImageResource(R.drawable.ic_launcher); title.setText("Hello"); info.setText("world"); return item; }
ListView優化
通過緩存convertView,這種利用緩存contentView的方式可以判斷如果緩存中不存在View才創建View,如果已經存在可以利用緩存中的View,提升了性能。
public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = mInflater.inflate(R.layout.list_item, null); } ImageView img = (ImageView)convertView.findViewById(R.id.img) TextView title = (TextView)convertView.findViewById(R.id.title); TextView info = (TextView)ConvertView.findViewById(R.id.info); img.setImageResource(R.drawable.ic_launcher); title.setText("Hello"); info.setText("world"); return convertView; }
ListView再優化
通過convertView+ViewHolder來實現,ViewHolder就是一個靜態類,使用 ViewHolder 的關鍵好處是緩存了顯示數據的視圖(View),加快了 UI 的響應速度。
當我們判斷 convertView == null 的時候,如果為空,就會根據設計好的List的Item布局(XML),來為convertView賦值,並生成一個viewHolder來綁定converView裡面的各個View控件(XML布局裡面的那些控件)。再用convertView的setTag將viewHolder設置到Tag中,以便系統第二次繪制ListView時從Tag中取出。(看下面代碼中)
注1:以下這些功能都是本人以MIUI ROM為例來講述的,如果你的Android沒有類似功能,可能是版本關系。部分功能需要安裝App來實現。注2:以下所述的優/缺點,全部
R資源, 是本地xml資源的引用列表, 修改時, 有可能Gradle沒有生成, 相應的R資源;則會出現R資源未找到的錯; 導致Java文件異常, 報錯.可以使用: Syn
Android是google公司針對手機開發的一個平台,並公布了其中大部分代碼,其大部分應用程序都是用JAVA開發的,畢竟它是商業性的產品嘛,有所保留也是理所當然的。對於
上例說過如果需要構造一些較復雜的類的實例,通常的方法是使用@Provides 方法。這個方法必須定義在模塊中(Module),而且必須使用@Provides 標注,在 個