ListView缓存机制

ListView缓存机制


说到ListView当然少不了Adapter了,Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面的额时候,都会调用AdaptergetView()这个方法返回一个View。这样,ListView中有多少项,就应该调用多少次getView()方法去绘制每一项的界面。如果项数少的时候(几十行),这是没问题的。但是如果有一万行,一百万行,那么就会出现问题了,它会占用系统极大的内存,所以必须采用性能优化的方法。

先说一下ListView的工作原理:ListView工作的时候,会针对每个item,要求Adapter对象返回一个ViewgetView()方法),也就是说,Listview在开始绘制的时候,系统首先调用getCount(),根据其返回值得到ListView的长度,然后根据这个长度,调用getView()一行一行的绘制ListView的每一项。

搞清楚了ListView的工作原理,我们就可以来看ListView的缓存机制了,如下:

1)如果有几千,几万行甚至更多的代码的时候,其中只有课件的项存在于内存中,其他的都在Recycler中,RecycleAndroid中专门用来处理缓存的组件。

2ListView先通过getView()方法请求一个View,然后请求其他可见的View。这时convertViewgetView中是空的。

3)当列表第一项滚出屏幕,并且一个新的项从屏幕低端上来时,ListView会再请求一个View,这时,convertView已经不是空值了,它的值是滚动出屏幕的第一项,之后只需要设定新的数据,然后返回convertView即可,而不必重新创建一个View


代码:

public class MainActivity extends ListActivity {

    private MyCustomAdapter mAdapter;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        mAdapter = new MyCustomAdapter();

        for (int i = 0; i < 100; i++) {

            mAdapter.addItem("item " + i);

        }

        setListAdapter(mAdapter);

    }

    private class MyCustomAdapter extends BaseAdapter {

        private ArrayList mData = new ArrayList();

        private LayoutInflater mInflater;

        public MyCustomAdapter() {

            mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        }

        public void addItem(final String item) {

            mData.add(item);

            notifyDataSetChanged();

        }

        @Override

        public int getCount() {

            return mData.size();

        }

        @Override

        public String getItem(int position) {

            return (String) mData.get(position);

        }

        @Override

        public long getItemId(int position) {

            return position;

        }

        @Override

        public View getView(int position, View convertView, ViewGroup parent) {

            System.out.println("getView " + position + " " + convertView);

            ViewHolder holder = null;

            if (convertView == null) {

                convertView = mInflater.inflate(R.layout.list_view_item, null);

                holder = new ViewHolder();

                holder.textView = (TextView) convertView

                        .findViewById(R.id.title);

                convertView.setTag(holder);

            } else {

                holder = (ViewHolder) convertView.getTag();

            }

            holder.textView.setText((CharSequence) mData.get(position));

            return convertView;
        }
    }
    public static class ViewHolder {
        public TextView textView;
    }

}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值