android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter
我最近做項(xiàng)目用到了基本適配器BaseAdapter,所以寫篇博客總結(jié)一下,希望也能對(duì)你有所幫助
什么時(shí)候用BaseAdapter(同一項(xiàng)存在多個(gè)控件,復(fù)雜的列表時(shí))
Android中Adapter類其實(shí)就是把數(shù)據(jù)源綁定到指定的View上,然后再返回該View,而返回來的這個(gè)View就是ListView中的某一行item。這里返回來的View正是由我們的Adapter中的getView方法返回的。這樣就會(huì)容易理解數(shù)據(jù)是怎樣一條一條顯示在ListView 中的。
簡(jiǎn)單的ListView可使用ArrayAdapter和SimpleAdapter兩種適配器。其中, ArrayAdapter適用于純文本的列表數(shù)據(jù),SimpleAdapter適用于帶圖標(biāo)的列表數(shù)據(jù)。實(shí)際應(yīng)用中常常有更復(fù)雜的列表,比如同一項(xiàng)中存在多個(gè)控件,這種情況即使用SimpleAdapter也很吃力,而且不易擴(kuò)展。基于此, Android提供了一種適應(yīng)性更強(qiáng)的基本適配器BaseAdapter,該適配器允許開發(fā)者在別的代碼文件中進(jìn)行邏輯處理,大大提高了代碼的可讀性和可維護(hù)性。
step1:創(chuàng)建列表單行的布局
新建一個(gè)layout,和普通的layout文件差不多,只不過這個(gè)文件設(shè)置的是ListView單項(xiàng)的樣式。
例如:item_layout.xml
android:id="@+id/textview_date"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="TextView"android:textAppearance="@style/TextAppearance.AppCompat.Medium"android:visibility="visible" />
android:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal">
android:id="@+id/image_time"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="0.5" />
android:id="@+id/textview_time"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:textAppearance="@style/TextAppearance.AppCompat.Large" />
step2:實(shí)現(xiàn)BaseAdapter的基本方法
寫一個(gè)新的適配器繼承BaseAdapter,從BaseAdapter派生的數(shù)據(jù)適配器主要實(shí)現(xiàn)下面幾個(gè)方法。
構(gòu)造函數(shù):指定適配器需要處理的數(shù)據(jù)集合。
getCount:獲取數(shù)據(jù)項(xiàng)的個(gè)數(shù)。
getView:獲取每項(xiàng)的展示視圖,并對(duì)每項(xiàng)的內(nèi)部控件進(jìn)行業(yè)務(wù)處理。
getItem:數(shù)據(jù)集中指定索引對(duì)應(yīng)的數(shù)據(jù)項(xiàng)。
例如:
public class MyListAdapter extendsBaseAdapter {
Context context;
List data; //數(shù)據(jù)源int layout; //Item布局
public MyListAdapter(Context context, int layout ,Listdata){this.context=context;this.layout=layout;this.data=data;
}/*** 這里的getCount方法是程序在加載顯示到ui上時(shí)就要先讀取的
* 這里獲得的值決定了listview顯示多少行
* 實(shí)際應(yīng)用中此處的返回值是由從數(shù)據(jù)庫中查詢出來的數(shù)據(jù)的總條數(shù)*/@Overridepublic intgetCount() {return data == null ? 0: data.size();
}/*** 根據(jù)ListView所在位置返回View
*@paramposition
*@return選中的數(shù)據(jù)*/@Overridepublic Object getItem(intposition) {
Nbp_data Nbp_choosen_data=data.get(position);//return Nbp_choosen_data == null ? null : data.get(position);
returnNbp_choosen_data;
}/*** 根據(jù)ListView位置得到數(shù)據(jù)源集合中的Id
*@paramposition
*@return
*/@Overridepublic long getItemId(intposition) {returnposition;
}/*** 重寫adapter最重要的就是重寫此方法,此方法也是決定listview界面的樣式的
*@paramposition
*@paramconvertView
*@paramparent
*@return
*/@Overridepublic View getView(intposition, View convertView, ViewGroup parent) {
ImageView imageView_time;
TextView textView_time;
TextView textView_date;final p_data record_data=data.get(position);if (convertView == null) {
convertView= LayoutInflater.from(context).inflate(layout,null);
}else{
}
imageView_time=(ImageView) convertView.findViewById(R.id.image_time);
textView_time=(TextView) convertView.findViewById(R.id.textview_time);
textView_date=(TextView) convertView.findViewById(R.id.textview_date);
imageView_time.setImageResource(record_data.getTimeImage());
textView_date.setText(record_data.getDATE());
textView_time.setText(record_data.getTIME());
returnconvertView;
}
}
在列表單行控件比較多的時(shí)候,ViewHolder方法可大幅度優(yōu)化ListView的滑動(dòng)。
step3:在Activity或Fragment中與ListView綁定
例如:
//在fragment的onCreateView()中
MyListAdapter myListAdapter=newMyListAdapter(root.getContext(),R.layout.item_layout,recorded_data);
ListView listView=(ListView)root.findViewById(R.id.lv_recordedData);
listView.setAdapter(myListAdapter);//設(shè)置事件監(jiān)聽
listView.setOnItemClickListener(newAdapterView.OnItemClickListener() {
@Overridepublic void onItemClick(AdapterView> arg0, View arg1, int arg2, longarg3) {
p_data choosen_data=(p_data)arg0.getItemAtPosition(arg2);int date =choosen_data.getDATE();int time =choosen_data.getTIME();}
});長(zhǎng)按事件監(jiān)聽
// listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){//@Override//public boolean onItemLongClick(AdapterView> arg0, View arg1, int arg2, long arg3){//return true;//}//});
參考:
《Android Studio開發(fā)實(shí)戰(zhàn):從零基礎(chǔ)到App上線》?歐陽燊??清華大學(xué)出版社
原文:https://www.cnblogs.com/XIEjm/p/12813935.html
總結(jié)
以上是生活随笔為你收集整理的android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言线程经常段错误的是,由pthrea
- 下一篇: android 环形时间显示_使用Ard