zoukankan      html  css  js  c++  java
  • 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的大小,可以看到每次都是加了十条数据,最后不足十条的时候也是成功添加一剩余的所有数据记录;

  • 相关阅读:
    spark dataframe 正则表达式匹配
    JVM申请的memory不够导致无法启动SparkContext
    <scope>provided</scope> 关于maven依赖中的scope的作用和用法
    web前端网站
    元素居中
    如何在Vue项目中使用vw实现移动端适配
    微任务、宏任务、同步、异步、Promise、Async、await
    前端自动化工作流环境
    Web前端学习笔记——构建前端自动化工作流环境
    JS判断值是否是数字
  • 原文地址:https://www.cnblogs.com/a284628487/p/3198392.html
Copyright © 2011-2022 走看看