zoukankan      html  css  js  c++  java
  • Adaptert Listview 优化

      这次是关于Listview的优化的,之前一直采用愚蠢的方式来使用listview,出现的情况就是数据多的话下拉的时候会出现卡顿的情况,内存占用多。所以学习了关于listview的优化,并且这也是普遍使用的方法。我们一般来说创建listview的话更常用的是继承BaseAdapter的方式进行实现,因为这样可以自定义list没一个item的布局,根据程序的需求进行定制,一般来说listview所展示的数据都是比较多的,一般也有比较少的。所以,不对adapter进行优化的话,那么每一次拖动listview都需要生成一次布局,这样的话,程序就可能会有卡顿的情况,并且这样的方式占用内存也比较多。主要是 getView(final int position, View convertView, ViewGroup parent){}的区别

      下面这种方式不推荐使用:

    public View getView(final int position, View convertView, ViewGroup parent) {   
        convertView= inflater.inflate(R.layout.activity_layout, null);
        TextView testName = (TextView) convertView
    					    .findViewById(R.id.testName_textview);
        TextView CassetteType = (TextView) convertView
    					    .findViewById(R.id.CassetteType_textview);
        TextView testTimeYear_textview = (TextView) convertView
    					    .findViewById(R.id.testTimeYear_textview);
        testName.setText("Hello");
        CassetteType.setText("Android");
        testTimeYear_textview.setText("Word");
    return view;
    }
    

      比较简单的例子,上面的方式不推荐使用,因为每一次加载item的时候都需要重新加载每一个控件,使得程序占用内存大,还可能会卡卡的感觉。

      推荐下面的方式使用:

    public View getView(final int position, View convertView,ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (null == convertView) {
            viewHolder = new ViewHolder();
            LayoutInflater mInflater = LayoutInflater.from(mContext);
            convertView = mInflater.inflate(R.layout.data_management, null);
            viewHolder.CassetteType = (TextView) convertView
                            .findViewById(R.id.CassetteType_textview);
            viewHolder.testTimeYear_textview = (TextView) convertView
                            .findViewById(R.id.testTimeYear_textview);
            viewHolder.testTime = (TextView) convertView
                            .findViewById(R.id.testTime_textview);
        convertView.setTag(viewHolder); }
    else { viewHolder = (ViewHolder) convertView.getTag(); } testName.setText("Hello"); CassetteType.setText("Android"); testTimeYear_textview.setText("Word"); return convertView; } private static class ViewHolder { TextView CassetteType; TextView testTimeYear_textview; TextView testTime; }

      这种方法的特点便是通过类ViewHolder,进行TextView的定义,Adapter每一次创建一个item的时候先判断convertView是否为空,为空的话就进行findViewById,其中最重要的是这个convertView.setTag(viewHolder);,convertView不为空的话就执行这句viewHolder = (ViewHolder) convertView.getTag();,然后每一个item就不需要重复性的去findViewById布局的每一个view了,这样就能优化listview的加载速度和减少内存使用,原理大概便是这样,可能也没有讲明,没能理解的话,建议搜搜listview优化。

  • 相关阅读:
    ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
    Atcoder Regular Contest 061 D Card Game for Three(组合数学)
    Solution 「CERC 2016」「洛谷 P3684」机棚障碍
    Solution 「CF 599E」Sandy and Nuts
    Solution 「洛谷 P6021」洪水
    Solution 「ARC 058C」「AT 1975」Iroha and Haiku
    Solution 「POI 2011」「洛谷 P3527」METMeteors
    Solution 「CF 1023F」Mobile Phone Network
    Solution 「SP 6779」GSS7
    Solution 「LOCAL」大括号树
  • 原文地址:https://www.cnblogs.com/caoRM/p/4333042.html
Copyright © 2011-2022 走看看