android:listview性能优化

1.在adapter中的getView方法中尽量少使用逻辑
2.尽最大可能避免GC。频繁GC通常是代码问题引起的内存泄露导致的
3.滑动的时候不加载图片将ListView的scrollingCache和animateCache设置为false
4.item的布局层级越烧越好
5.使用ViewHolder。减少findViewById
6、convertView减少加载布局。ViewHolder只是将需要缓存的那些view封装好,convertView的setTag才是将这些缓存起来供下次调用
7、RecyclerView 是Android L版本中新增加的,可以完美代替Listview,Gridview 瀑布流

对于2,有个点击事件的优化。
如果每个getView中,有多个点击事件,如果对每个子view进行setOnclickListener,就会出现多个listener对象在内存中,如果View回收不畅,会更多,这样,在滚动的时候频繁GC 就会导致卡顿,所以可以统一设置listener

优化后的demo

package demo.hq201612.com.frbretrofitrxjava.questions.listviewadapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;

import java.util.ArrayList;
import java.util.List;

import demo.hq201612.com.frbretrofitrxjava.R;
import demo.hq201612.com.frbretrofitrxjava.basic.CMLog;

/**
 * Created by huqing on 2017/1/9.
 */

public class ListViewAdapter extends BaseAdapter
{
    private List<String> datas = new ArrayList<>();

    private LayoutInflater mInflater;

    private Context mContext;


    public ListViewAdapter(Context mContext, List<String> datas)
    {
        this.datas = datas;
        this.mInflater = LayoutInflater.from(mContext);
        this.mContext = mContext;
    }

    @Override
    public int getCount()
    {
        return datas.size();
    }

    @Override
    public Object getItem(int position)
    {
        return this.datas.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder = null;
        if (convertView == null)
        {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.item_lv, null);
            holder.bn1 = (Button) convertView.findViewById(R.id.bn1);
            holder.bn2 = (Button) convertView.findViewById(R.id.bn2);
            holder.bn3 = (Button) convertView.findViewById(R.id.bn3);
            holder.bn4 = (Button) convertView.findViewById(R.id.bn4);
            holder.bn1.setOnClickListener(holder);
            holder.bn2.setOnClickListener(holder);
            holder.bn3.setOnClickListener(holder);
            holder.bn4.setOnClickListener(holder);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.setPosition(position);
        holder.bn1.setText(position + "  " + datas.get(position));

        return convertView;
    }

    private class ViewHolder implements View.OnClickListener
    {
        private Button bn1;

        private Button bn2;

        private Button bn3;

        private Button bn4;

        private int position;

        public void setPosition(int position)
        {
            this.position = position;
        }

        @Override
        public void onClick(View v)
        {
            switch (v.getId())
            {
                case R.id.bn1:
                    CMLog.e("hq",position + " 左上");
                    break;
                case R.id.bn2:
                    CMLog.e("hq",position + " 右上");
                    break;
                case R.id.bn3:
                    CMLog.e("hq",position + " 左下");
                    break;
                case R.id.bn4:
                    CMLog.e("hq",position + " 右下");
                    break;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值