日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android BaseAdapter与ListView的使用

發布時間:2024/4/15 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android BaseAdapter与ListView的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android BaseAdapter與ListView的使用

定義:BaseAdapterextends?Objectimplements?ListAdapter?SpinnerAdapter

BaseAdapter是抽象類,因此必須通過繼承才能使用,BaseAdapter是實現了ListAdapter和SpinnerAdapter兩個接口,當然它也可以直接給ListView和Spinner等UI組件直接提供數據。

相關類結構如下圖所示:

ListView的使用中,有時候還需要在里面加入按鈕等控件,實現單獨的操作。也就是說,這個ListView不再只是展示數據,也不僅僅是這一行要來處理用戶的操作,而是里面的控件要獲得用戶的焦點。讀者可以試試用SimpleAdapter添加一個按鈕到ListView的條目中,會發現可以添加,但是卻無法獲得焦點,點擊操作被ListViewItem所覆蓋。這時候最方便的方法就是使用靈活的適配器BaseAdapter了。

? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ?▲4-35 BaseAdapter中的方法

使用BaseAdapter必須寫一個類繼承它,同時BaseAdapter是一個抽象類,繼承它必須實現它的方法。BaseAdapter的靈活性就在于它要重寫很多方法,看一下有哪些方法,如圖4-35所示為繼承自BaseAdapterSpeechListAdapter所實現的方法,其中最重要的即為getView()方法。這些方法都有什么作用呢?我們通過分析ListView的原理來為讀者解答。

? 當系統開始繪制ListView的時候,首先調用getCount()方法。得到它的返回值,即ListView的長度。然后系統調用getView()方法,根據這個長度逐一繪制ListView的每一行。也就是說,如果讓getCount()返回1,那么只顯示一行。而getItem()getItemId()則在需要處理和取得Adapter中的數據時調用。那么getView如何使用呢?如果有10000行數據,就繪制10000次?這肯定會極大的消耗資源,導致ListView滑動非常的慢,那應該怎么做呢?通過一個例子來講解如何在使用BaseAdapter的時候優化ListView的顯示。例子中將上一節中的ImageView換成Button,并且處理Button的點擊事件,其中對ListView的顯示做了優化。

? 布局文件和上一例類同,讀者可以在光盤的工程目錄中查看,這里只給出Activity類。

publicclass MyListViewBase extends Activity {private ListView lv;//定義一個動態數組 ArrayList<HashMap<String, Object>>listItem;/** Called when the activity is first created. */@Overridepublicvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);lv = (ListView) findViewById(R.id.lv);MyAdapter mAdapter = new MyAdapter(this);//得到一個MyAdapter對象lv.setAdapter(mAdapter);//為ListView綁定Adapter/**為ListView添加點擊事件*/lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {Log.v("MyListViewBase", "你點擊了ListView條目" + arg2);//在LogCat中輸出信息 }});}/**添加一個得到數據的方法,方便使用*/private ArrayList<HashMap<String, Object>> getDate(){ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String,Object>>();/**為動態數組添加數據*/ for(int i=0;i<30;i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemTitle", "第"+i+"行"); map.put("ItemText", "這是第"+i+"行"); listItem.add(map); }return listItem;}/** 新建一個類繼承BaseAdapter,實現視圖與數據的綁定*/privateclass MyAdapter extends BaseAdapter {private LayoutInflater mInflater;//得到一個LayoutInfalter對象用來導入布局 /**構造函數*/public MyAdapter(Context context) {this.mInflater = LayoutInflater.from(context);}@Overridepublicint getCount() {return getDate().size();//返回數組的長度 }@Overridepublic Object getItem(int position) {returnnull;}@Overridepubliclong getItemId(int position) {return 0;}/**書中詳細解釋該方法*/ @Overridepublic View getView(finalint position, View convertView, ViewGroup parent) {ViewHolder holder;//觀察convertView隨ListView滾動情況 Log.v("MyListViewBase", "getView " + position + " " + convertView);if (convertView == null) {convertView = mInflater.inflate(R.layout.item,null);holder = new ViewHolder();/**得到各個控件的對象*/ holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);holder.text = (TextView) convertView.findViewById(R.id.ItemText);holder.bt = (Button) convertView.findViewById(R.id.ItemButton);convertView.setTag(holder);//綁定ViewHolder對象 }else{holder = (ViewHolder)convertView.getTag();//取出ViewHolder對象 }/**設置TextView顯示的內容,即我們存放在動態數組中的數據*/ holder.title.setText(getDate().get(position).get("ItemTitle").toString());holder.text.setText(getDate().get(position).get("ItemText").toString());/**為Button添加點擊事件*/ holder.bt.setOnClickListener(new OnClickListener() {@Overridepublicvoid onClick(View v) {Log.v("MyListViewBase", "你點擊了按鈕" + position);//打印Button的點擊信息 }});return convertView;}}/**存放控件*/publicfinalclass ViewHolder{public TextView title;public TextView text;public Button bt;} }

運行效果如圖4-36所示。還需要注意的是,Button會搶奪ListView的焦點,需要將Button設置為沒有焦點。設置非常簡單,只需要在xmlButton標簽下加入一行:android:focusable=“false”代碼就可以了。在LogCat觀察點擊后輸出的信息,如圖4-37所示。

? ? ? ? ? ??

參考資料:http://www.open-open.com/lib/view/open1339485728006.html?


總結

以上是生活随笔為你收集整理的Android BaseAdapter与ListView的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。