您的位置:首页 > 移动开发 > Android开发

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代码

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>



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: