2016-12-22 9 views
0

Я пытаюсь реализовать свой пользовательский адаптер, но я столкнулся с проблемами производительности. Кажется, что каждый раз, когда я просматриваю список, он загружается снова и снова. Я хочу, чтобы он удерживал представление и отображал только видимую часть. У моего элемента списка есть просмотр изображений и текст. Мой код:Пользовательский адаптер 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.

Но я использую внутренний держатель класса, так что я не знаю, как решить эту проблему ,

ответ

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(); 
    } 
+0

Это, как я делал это в прошлом. В принципе, он проверяет, имеет ли представление, представленное в вызове getView() значение null. Если да, то он создает новый. В противном случае, поскольку вы обладаете всей информацией тегом, она просто «перерабатывает», что рассматривает информацию. –

+0

@JuLes Спасибо, после некоторых изменений мне удалось заставить его работать. Отмечено, как ответили. –

Смежные вопросы