Android ListView的优化
最近的项目中有通讯录这个模块,里面的通讯录涉及的联系人数量很大,导致在加载页面的时候有点卡,所以就必须得进行优化,优化的最终实现理论是什么?就是让ListView一次性加载的数据较少,后续根据用户操作{向下滑动}再加载更多的数据,避免了一次性加载数据导致程序运行不畅的问题;
在参考网上的一些方法之后,总觉得那些方法都不是我想要的,都是一个模子里面刻出来的,大多数都是加footerview,因为我的项目中的ListView的数据源是需要按照一定的顺序排列的,如果加载之后再进行排序又会导致程序运行不畅,所以我想要寻找一种个人认为更容易的方法;
实现思路:首先在adapter中保存全部的数据记录,在adapter中另外创建一个List保存当前要显示的数据记录;根据ListView的滚动状态判断是否滚动到最后一项,如果滚动到最后一项,并且还有数据没显示完的话就加载更多的数据;
下面是实现代码:
1、自定义Adapter
public class AAAdapter extends BaseAdapter { private List<String> orign_list; private List<String> list; private LayoutInflater inflater; private int getOrignSize() { return orign_list.size(); } @Override public int getCount() { return list.size(); } public void more() { int size = this.list.size(); int orignsize = getOrignSize(); if (size < orignsize) { List<String> toadd = orign_list.subList(size, size + 10 >= orignsize ? orignsize : size + 10); // 注意上面的subList,判断当前显示的列表的长度加上每次要动态添加的数据的条数是否大于总列表长度,再判断加载多少条数据 list.addAll(toadd); notifyDataSetChanged(); // 通知数据记录发生改变
Log.e("ListSize", "" + list.size()); } } public AAAdapter(List<String> orign_list, Context context) { super(); this.inflater = LayoutInflater.from(context); this.orign_list = orign_list; this.list = new ArrayList<String>(); this.list.addAll(orign_list.subList(0, 19)); // 初次加载显示20条数据 } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = inflater.inflate(R.layout.ba, null); TextView tv = (TextView) convertView.findViewById(R.id.tv); tv.setText(list.get(position)); return convertView; } }
2、修改Activity实现数据动态加载
public class MainActivity extends Activity { AAAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv = (ListView) findViewById(R.id.lv); List<String> orign_list = new ArrayList<String>(); for (int i = 0; i < 97; i++) { orign_list.add("item - " + i); } adapter = new AAAdapter(orign_list, getApplicationContext()); lv.setAdapter(adapter); study(lv); } public void study(ListView lv) { // 在getView方法里面对滚动状态做出相应的处理 lv.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case OnScrollListener.SCROLL_STATE_FLING: // 正在滚动 break; case OnScrollListener.SCROLL_STATE_IDLE: // 滚动完成 break; case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 正在滚动 break; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int lastIndex = firstVisibleItem + visibleItemCount - 1; // 获取当前可视的最后一项 if (totalItemCount == lastIndex + 1) { // 已经显示到最后一项了 adapter.more(); } } }); } }
下面是控制台打印出的当前显示List的大小,可以看到每次都是加了十条数据,最后不足十条的时候也是成功添加一剩余的所有数据记录;