[Android]ListView优化

本文详细介绍ListView的性能优化方法,包括convertView复用、ViewHolder模式及分段加载等技术,旨在提高ListView滚动流畅性和加载速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ListView的几种优化方式

convertView的复用

第一种优化就是重用convertView,这也是最简单的一种优化方式,就是在Adapter类的getView方法中通过判断convertView是否为null,是的话就需要在创建一个视图出来,然后给视图设置数据,最后将这个视图返回给底层,呈现给用户;如果不为null的话,其他新的view可以通过复用的方式使用已经消失的条目view,重新设置上数据然后展现出来。

ViewHolder的使用

 第一种优化方式有个缺点,就是每次在findviewById,重新找到控件,然后对控件进行赋值,这样会减慢加载的速度,其实我们可以创建一个内部类ViewHolder,里面的成员变量和view中所包含的组件个数、类型相同,在convertview为null的时候,把findviewbyId找到的控件赋给ViewHolder中对应的变量,就相当于先把它们装进一个容器,下次要用的时候,直接从容器中获取,这样是不是比findviewbyId效率要高一点?

使用分段加载

使用分页记载  

##要了解RecycleBin机制: android-----带你一步一步优化ListView(一)

1和2参考一下代码: 

public class SearchHistoryAdapter extends ArrayAdapter<String> {

    private int resourceId;
    private List<String> list;
    private HistoryClickInterface historyClickInterface;


    SearchHistoryAdapter(@NonNull Context context, int resource, @NonNull List<String> list) {
        super(context, resource, list);
        this.resourceId = resource;
        this.list = list;
    }

    public void HistorySetOnclick(HistoryClickInterface historyClickInterface) {
        this.historyClickInterface = historyClickInterface;
    }

    public interface HistoryClickInterface {
        void clickItem(View view, int position);

        void clickDelete(View view, int position);
    }


    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View view;
        ViewHolder viewHolder;

        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.historyItem = (TextView) view.findViewById(R.id.history_item);
            viewHolder.deleteBtn = (LinearLayout) view.findViewById(R.id.delete_btn);

            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.historyItem.setText(list.get(position));

        LinearLayout itemLayout = (LinearLayout) view.findViewById(R.id.item_layout);
        itemLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (historyClickInterface != null) {
                    historyClickInterface.clickItem(v, position);
                }
            }
        });
        viewHolder.deleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (historyClickInterface != null) {
                    historyClickInterface.clickDelete(v, position);
                }
            }
        });

        return view;
    }


    class ViewHolder {
        TextView historyItem;
        LinearLayout deleteBtn;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值