Android开发之ListView-BaseAdapter的使用
2015-07-20 17:17
399 查看
ListView优化原则:
UI优化:
listview条目与条目之间的间隙的分割内容:android:divider="@android:color/transparent"
listview条目之间的间隙:android:paddingTop="5.0dip"
listview点中的颜色变化:android:listSelector="@color/transparent"
在listview的右边会显示出来一个快速滚动的进度条:android:fastScrollEnabled="true"
数据适配性能优化:
1.复用历史缓存的view对象converview,减少采用布局填充器服务和填充布局的次数,达到减少xml->view操作的次数.
2.定义静态的viewholder,储存了view对象里面控件的引用,view.setTag()view.getTag(),减少遍历view对象树状结构的次数
3.采用了内存缓存,缓存一些经常使用的数据:
服务器上的图片,缓存这些图片到手机的Rom卡,sd卡,然后把图片给缓存到内存里面;
缓存从数据库中查询出的所有数据,减少查询数据库的动作
高级优化:
listview的延时加载:如果listview里面要显示的有很多的数据,我们不需要一次把所有的数据都获取出来.
分批的加载数据:注册listview滚动监听器onScrollListener(),发现最后一个可见的条目为listview里面数据适配器里面的最后的一个条目,从服务器加载更多的内容.
分页的加载数据:服务器需要提供接口,一次获取一段的数据;数据库提供接口,一次查询一段的数据.
listview的快速拖动优化:
当listview在滚动状态下,不去加载listview里面真实的图片和内容,而是把一个缩略图加载界面上.
当listview的滚动状态停止的时候才去真正的更新里面的条目的内容.
如何让你的ListView实现自动滚动呢?Android其实已经考虑到ListView控件的智能滚动操作。
直接在Layout中写即可,注意下面的stackFromBottom以及transcriptMode这两个属性。
BaseAdapter,官网链接--http://developer.android.com/intl/zh-cn/reference/android/widget/BaseAdapter.html
继承:Object
接口:ListAdapterSpinnerAdapter
已知直接子类:
ArrayAdapter<T>,CursorAdapter,SimpleAdapter
已知间接子类:
ResourceCursorAdapter,SimpleCursorAdapter
使用BaseAdapter,需要实现4个方法:
getCount()--返回需要ListView显示的item数量
getItem(intposition)--返回item的位置
getItemId(intposition)--返回item的id
getView(intposition,ViewconvertView,ViewGroupparent)--显示item的内容
--------------------------------------------------------------------------------------------------------------------------------------
实例(创建一个通讯录):
MainActivity.java代码
获取通讯录中联系人的姓名和号码,GetPhone.java
实体类PhoneInfo.java
MyAdapter.java
UI优化:
listview条目与条目之间的间隙的分割内容:android:divider="@android:color/transparent"
listview条目之间的间隙:android:paddingTop="5.0dip"
listview点中的颜色变化:android:listSelector="@color/transparent"
在listview的右边会显示出来一个快速滚动的进度条:android:fastScrollEnabled="true"
数据适配性能优化:
1.复用历史缓存的view对象converview,减少采用布局填充器服务和填充布局的次数,达到减少xml->view操作的次数.
2.定义静态的viewholder,储存了view对象里面控件的引用,view.setTag()view.getTag(),减少遍历view对象树状结构的次数
3.采用了内存缓存,缓存一些经常使用的数据:
服务器上的图片,缓存这些图片到手机的Rom卡,sd卡,然后把图片给缓存到内存里面;
缓存从数据库中查询出的所有数据,减少查询数据库的动作
高级优化:
listview的延时加载:如果listview里面要显示的有很多的数据,我们不需要一次把所有的数据都获取出来.
分批的加载数据:注册listview滚动监听器onScrollListener(),发现最后一个可见的条目为listview里面数据适配器里面的最后的一个条目,从服务器加载更多的内容.
分页的加载数据:服务器需要提供接口,一次获取一段的数据;数据库提供接口,一次查询一段的数据.
listview的快速拖动优化:
当listview在滚动状态下,不去加载listview里面真实的图片和内容,而是把一个缩略图加载界面上.
当listview的滚动状态停止的时候才去真正的更新里面的条目的内容.
如何让你的ListView实现自动滚动呢?Android其实已经考虑到ListView控件的智能滚动操作。
直接在Layout中写即可,注意下面的stackFromBottom以及transcriptMode这两个属性。
BaseAdapter,官网链接--
继承:Object
接口:ListAdapterSpinnerAdapter
已知直接子类:
ArrayAdapter<T>,CursorAdapter,SimpleAdapter
已知间接子类:
ResourceCursorAdapter,SimpleCursorAdapter
使用BaseAdapter,需要实现4个方法:
getCount()--返回需要ListView显示的item数量
getItem(intposition)--返回item的位置
getItemId(intposition)--返回item的id
getView(intposition,ViewconvertView,ViewGroupparent)--显示item的内容
--------------------------------------------------------------------------------------------------------------------------------------
实例(创建一个通讯录):
MainActivity.java代码
publicclassMainActivityextendsActivity{ privateListViewphoneList; privateMyAdapteradapter; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GetPhone.getPhone(MainActivity.this); phoneList=(ListView)findViewById(R.id.phoneList); adapter=newMyAdapter(GetPhone.lists,MainActivity.this); phoneList.setAdapter(adapter); } }
布局文件activity_main.xml
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.lijingbo.getmyphonenumber.MainActivity"> <ListView android:id="@+id/phoneList" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </LinearLayout>
获取通讯录中联系人的姓名和号码,GetPhone.java
publicclassGetPhone{ staticList<PhoneInfo>lists=newArrayList<PhoneInfo>(); publicstaticList<PhoneInfo>getPhone(Contextcontext){ ContentResolvercontentResolver=context.getContentResolver(); Cursorcursor=contentResolver.query(Phone.CONTENT_URI,null,null, null,null); while(cursor.moveToNext()){ Stringnumber=cursor.getString(cursor .getColumnIndex(Phone.NUMBER)); Stringname=cursor.getString(cursor .getColumnIndex(Phone.DISPLAY_NAME)); Log.d("getmyphonenumber",name+"电话号码:"+number); PhoneInfophoneInfo=newPhoneInfo(name,number); lists.add(phoneInfo); } returnlists; } }
实体类PhoneInfo.java
publicclassPhoneInfo{ privateStringname; privateStringnumber; publicPhoneInfo(Stringname,Stringnumber){ setName(name); setNumber(number); } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetNumber(){ returnnumber; } publicvoidsetNumber(Stringnumber){ this.number=number; } }
MyAdapter.java
publicclassMyAdapterextendsBaseAdapter{ privateList<PhoneInfo>lists; privateContextcontext; publicMyAdapter(List<PhoneInfo>lists,Contextcontext){ this.lists=lists; this.context=context; } @Override publicintgetCount(){ returnlists.size(); } @Override publicObjectgetItem(intposition){ returnposition; } @Override publiclonggetItemId(intposition){ returnposition; } @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ ViewHolderholder=null; if(convertView==null){ holder=newViewHolder(); convertView=LayoutInflater.from(context).inflate(R.layout.phonedetails,null); holder.showName=(TextView)convertView.findViewById(R.id.showName); holder.showNumber=(TextView)convertView.findViewById(R.id.showNumber); convertView.setTag(holder); }else{ holder=(ViewHolder)convertView.getTag(); } holder.showName.setText(lists.get(position).getName()); holder.showNumber.setText(lists.get(position).getNumber()); returnconvertView; } staticclassViewHolder{ publicTextViewshowName; publicTextViewshowNumber; } }
phonedetails.xml文件
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:id="@+id/showName" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="name"/> <TextView android:id="@+id/showNumber" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="number"/> </LinearLayout>
相关文章推荐
- [Android]使用ProGuard遇到“conversion to Dalvik format failed with error 1”错误的解决办法
- Android sqlite数据库操作卡顿解决办法
- android Scroller浅析
- 删除android工程不再使用的资源文件
- adapter详解
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- Android Studio添加so库文件方法
- 解决Android SDK下载和更新失败的方法(Win系统) 和离线安装
- Android内存泄漏的各种原因详解
- Android应用内存泄漏与分析
- Android Studio安装以及Fetching android sdk component information超时的解决方案
- Android中下载文件并保存到SD卡
- Service中传递自定义类的问题分析
- Android改变图片颜色及设置动画
- android代码中判断SDcard是否存在,剩余内存
- Activity的几种加载启动模式介绍
- android的materialDesignLibrary源代码分析
- 关于android4.4中调用js的问题解决
- 关于android4.4中调用js的问题解决
- PX2关于Adb工具的使用