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
接口: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>