ListView中Adapter的优化

优化前

public class FruitAdapter extends ArrayAdapter<Fruit> {

    private final int resourceId;

    @NonNull
    @Override
    @SuppressLint("ViewHolder")
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Fruit fruit = getItem(position); //获取当前项的Fruit实例
        View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false); //动态加载资源
        ImageView fruitImage = view.findViewById(R.id.fruit_image);
        TextView fruitName = view.findViewById(R.id.fruit_name);
        fruitImage.setImageResource(fruit.getImageId());
        fruitName.setText(fruit.getName());
        return view;
    }

    public FruitAdapter(@NonNull MainActivity context, @NonNull List<Fruit> objects, int resourceId) {
        super(context, resourceId, objects);
        this.resourceId = resourceId;
    }
}

优化后

public class FruitAdapter extends ArrayAdapter<Fruit> {

    private final int resourceId;

    @NonNull
    @Override
    @SuppressLint("ViewHolder")
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Fruit fruit = getItem(position); //获取当前项的Fruit实例
        View view;
        ViewHolder viewHolder;
        if (convertView == null) { //优化一下可以避免重复加载动态布局
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.fruitImage = view.findViewById(R.id.fruit_image);
            viewHolder.fruitName = view.findViewById(R.id.fruit_name);
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.fruitImage.setImageResource(fruit.getImageId());
        viewHolder.fruitName.setText(fruit.getName());
        return view;
    }

    public FruitAdapter(@NonNull MainActivity context, @NonNull List<Fruit> objects, int resourceId) {
        super(context, resourceId, objects);
        this.resourceId = resourceId;
    }

    static class ViewHolder { //暂存ListView子项中的图片和名称,避免重复调用findViewById
        ImageView fruitImage;
        TextView fruitName;
    }
}
posted @ 2022-07-31 18:17  jarico  阅读(27)  评论(0)    收藏  举报