android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter
我最近做項目用到了基本適配器BaseAdapter,所以寫篇博客總結一下,希望也能對你有所幫助
什么時候用BaseAdapter(同一項存在多個控件,復雜的列表時)
Android中Adapter類其實就是把數據源綁定到指定的View上,然后再返回該View,而返回來的這個View就是ListView中的某一行item。這里返回來的View正是由我們的Adapter中的getView方法返回的。這樣就會容易理解數據是怎樣一條一條顯示在ListView 中的。
簡單的ListView可使用ArrayAdapter和SimpleAdapter兩種適配器。其中, ArrayAdapter適用于純文本的列表數據,SimpleAdapter適用于帶圖標的列表數據。實際應用中常常有更復雜的列表,比如同一項中存在多個控件,這種情況即使用SimpleAdapter也很吃力,而且不易擴展。基于此, Android提供了一種適應性更強的基本適配器BaseAdapter,該適配器允許開發者在別的代碼文件中進行邏輯處理,大大提高了代碼的可讀性和可維護性。
step1:創建列表單行的布局
新建一個layout,和普通的layout文件差不多,只不過這個文件設置的是ListView單項的樣式。
例如: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:實現BaseAdapter的基本方法
寫一個新的適配器繼承BaseAdapter,從BaseAdapter派生的數據適配器主要實現下面幾個方法。
構造函數:指定適配器需要處理的數據集合。
getCount:獲取數據項的個數。
getView:獲取每項的展示視圖,并對每項的內部控件進行業務處理。
getItem:數據集中指定索引對應的數據項。
例如:
public class MyListAdapter extendsBaseAdapter {
Context context;
List data; //數據源int layout; //Item布局
public MyListAdapter(Context context, int layout ,Listdata){this.context=context;this.layout=layout;this.data=data;
}/*** 這里的getCount方法是程序在加載顯示到ui上時就要先讀取的
* 這里獲得的值決定了listview顯示多少行
* 實際應用中此處的返回值是由從數據庫中查詢出來的數據的總條數*/@Overridepublic intgetCount() {return data == null ? 0: data.size();
}/*** 根據ListView所在位置返回View
*@paramposition
*@return選中的數據*/@Overridepublic Object getItem(intposition) {
Nbp_data Nbp_choosen_data=data.get(position);//return Nbp_choosen_data == null ? null : data.get(position);
returnNbp_choosen_data;
}/*** 根據ListView位置得到數據源集合中的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;
}
}
在列表單行控件比較多的時候,ViewHolder方法可大幅度優化ListView的滑動。
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);//設置事件監聽
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();}
});長按事件監聽
// listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){//@Override//public boolean onItemLongClick(AdapterView> arg0, View arg1, int arg2, long arg3){//return true;//}//});
參考:
《Android Studio開發實戰:從零基礎到App上線》?歐陽燊??清華大學出版社
原文:https://www.cnblogs.com/XIEjm/p/12813935.html
總結
以上是生活随笔為你收集整理的android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言线程经常段错误的是,由pthrea
- 下一篇: amba simple class驱动_