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这两个属性。
继承:Object
接口:ListAdapter SpinnerAdapter
已知直接子类:
ArrayAdapter<T>, CursorAdapter, SimpleAdapter
已知间接子类:
ResourceCursorAdapter, SimpleCursorAdapter
使用BaseAdapter,需要实现4个方法:
getCount() --返回需要ListView显示的item数量
getItem(int position) --返回item的位置
getItemId(int position) --返回item的id
getView(int position, View convertView, ViewGroup parent) --显示item的内容
--------------------------------------------------------------------------------------------------------------------------------------
实例(创建一个通讯录):
MainActivity.java代码
1 public class MainActivity extends Activity {
2
3 private ListView phoneList;
4 private MyAdapter adapter;
5
6 @Override
7 protected void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity_main);
10 GetPhone.getPhone(MainActivity.this);
11 phoneList = (ListView) findViewById(R.id.phoneList);
12 adapter = new MyAdapter(GetPhone.lists, MainActivity.this);
13 phoneList.setAdapter(adapter);
14 }
15
16 }
布局文件activity_main.xml
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical"
6 tools:context="com.lijingbo.getmyphonenumber.MainActivity" >
7
8 <ListView
9 android:id="@+id/phoneList"
10 android:layout_width="match_parent"
11 android:layout_height="match_parent" >
12 </ListView>
13
14 </LinearLayout>
获取通讯录中联系人的姓名和号码,GetPhone.java
1 public class GetPhone {
2
3 static List<PhoneInfo> lists = new ArrayList<PhoneInfo>();
4
5 public static List<PhoneInfo> getPhone(Context context) {
6
7 ContentResolver contentResolver = context.getContentResolver();
8 Cursor cursor = contentResolver.query(Phone.CONTENT_URI, null, null,
9 null, null);
10 while (cursor.moveToNext()) {
11 String number = cursor.getString(cursor
12 .getColumnIndex(Phone.NUMBER));
13 String name = cursor.getString(cursor
14 .getColumnIndex(Phone.DISPLAY_NAME));
15 Log.d("getmyphonenumber", name + "电话号码:" + number);
16 PhoneInfo phoneInfo = new PhoneInfo(name, number);
17 lists.add(phoneInfo);
18 }
19 return lists;
20 }
21 }
实体类 PhoneInfo.java
1 public class PhoneInfo {
2
3 private String name;
4 private String number;
5
6 public PhoneInfo(String name, String number) {
7 setName(name);
8 setNumber(number);
9
10 }
11
12 public String getName() {
13 return name;
14 }
15
16 public void setName(String name) {
17 this.name = name;
18 }
19
20 public String getNumber() {
21 return number;
22 }
23
24 public void setNumber(String number) {
25 this.number = number;
26 }
27
28 }
MyAdapter.java
1 public class MyAdapter extends BaseAdapter {
2
3 private List<PhoneInfo> lists;
4 private Context context;
5
6 public MyAdapter(List<PhoneInfo> lists,Context context){
7 this.lists=lists;
8 this.context=context;
9 }
10
11 @Override
12 public int getCount() {
13 return lists.size();
14 }
15
16 @Override
17 public Object getItem(int position) {
18 return position;
19 }
20
21 @Override
22 public long getItemId(int position) {
23 return position;
24 }
25
26 @Override
27 public View getView(int position, View convertView, ViewGroup parent) {
28 ViewHolder holder=null;
29 if (convertView==null) {
30 holder=new ViewHolder();
31 convertView=LayoutInflater.from(context).inflate(R.layout.phonedetails, null);
32 holder.showName=(TextView) convertView.findViewById(R.id.showName);
33 holder.showNumber=(TextView) convertView.findViewById(R.id.showNumber);
34 convertView.setTag(holder);
35 }else {
36 holder=(ViewHolder) convertView.getTag();
37 }
38 holder.showName.setText(lists.get(position).getName());
39 holder.showNumber.setText(lists.get(position).getNumber());
40 return convertView;
41 }
42
43 static class ViewHolder{
44 public TextView showName;
45 public TextView showNumber;
46 }
47
48 }
phonedetails.xml文件
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="horizontal" >
6
7 <TextView
8 android:id="@+id/showName"
9 android:layout_width="0dp"
10 android:layout_height="wrap_content"
11 android:layout_weight="1"
12 android:text="name"/>
13 <TextView
14 android:id="@+id/showNumber"
15 android:layout_width="0dp"
16 android:layout_weight="1"
17 android:layout_height="wrap_content"
18 android:text="number"/>
19
20 </LinearLayout>