Пользовательский адаптер Smart Scrolling

Я пытаюсь реализовать свой собственный адаптер, но у меня проблемы с производительностью. Кажется, что каждый раз, когда я прокручиваю список, он загружается снова и снова. Я хочу, чтобы он удерживал вид и отображал только видимую часть. Мой элемент списка имеет изображения и текстовое представление. Мой код:

 class CustomAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<CounselorInfo> counselors;
    private static LayoutInflater inflater = null;

    CustomAdapter(Context context, ArrayList<CounselorInfo> counselors) {

        this.context = context;
        this.counselors = counselors;

        inflater = ( LayoutInflater )context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public Object getItem(int position) {
        return position;
    }

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

    private class Holder
    {
        TextView textView;
        ImageView imageView;
    }@Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        Holder holder = new Holder();
        View rowView = inflater.inflate(R.layout.counselors_list, null);

        holder.textView = (TextView) rowView.findViewById(R.id.nameCounselor);
        holder.imageView = (ImageView) rowView.findViewById(R.id.imageCounselor);

        holder.textView.setText(counselors.get(position).getName());
        ImageLoadTask imageLoad = new ImageLoadTask(" http:// " + counselors.get(position).getImageURL(), holder.imageView);
        imageLoad.execute();

        rowView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something
            }
        });

        return rowView;
    }
}

Студия Android дает предложение на эту строку:

View rowView = inflater.inflate(R.layout.counselors_list, null);

это говорит: Unconditional layout inflation from view adapter: Should use View Holder pattern (use recycled view passed into this method as the second parameter) for smoother scrolling.

Но я использую внутренний класс Holder, поэтому я не знаю, как это решить.

1 ответ

Решение

Добавить это на getView():

    final Holder holder;

    if (convertView == null) {
        holder = new Holder();

        View rowView = inflater.inflate(R.layout.counselors_list, null);
        holder.textView = (TextView) rowView.findViewById(R.id.nameCounselor);
        holder.imageView = (ImageView) rowView.findViewById(R.id.imageCounselor);

        convertView.setTag(holder);

    } else

    {
        holder = (Holder) convertView.getTag();
    }
Другие вопросы по тегам