2014-12-08 5 views
0

Ниже приведен код для моего адаптера пользовательского списка для списка. Адаптер отлично работает, если я прокомментирую токен «не нуль» в моем коде, который без моего владельца. Может ли кто-нибудь помочь мне с проблемой, которую я здесь?Viewholder не работает для пользовательского адаптера

public View getView(int i, View view, ViewGroup viewGroup) { 

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View row = inflater.inflate(R.layout.eachlist, viewGroup, false); 

     if (this.subject==null && this.percentage==null && this.happen==null && this.missed==null) { 

      Log.d("null cha","error"); 
      subject = (TextView) row.findViewById(R.id.subjectname); 
      happen=(TextView)row.findViewById(R.id.attended); 
      missed=(TextView)row.findViewById(R.id.missed); 
      percentage=(TextView)row.findViewById(R.id.Attendance); 

      new viewholder(subject,happen,missed,percentage); 
     } 
     else { 

      subject=viewholder.subject; 
      happen=viewholder.happen; 
      missed=viewholder.missed; 
      percentage=viewholder.percentage; 

     } 

     subject.setText(list.get(i).subject); 
     happen.setText(String.valueOf(list.get(i).happened)); 
     missed.setText(String.valueOf(list.get(i).missed)); 
     percentage.setText(String.valueOf(list.get(i).percentage)); 

     return row; 
    } 
    static class viewholder{ 
     static TextView subject; 
     static TextView happen; 

     static TextView missed; 
     static TextView percentage; 

     viewholder(TextView subject,TextView happen,TextView missed,TextView percentage){ 
      this.subject=subject; 
      this.happen=happen; 
      this.missed=missed; 
      this.percentage=percentage; 

     } 


    } 
+0

Вы делаете это неправильно. Проверьте этот учебник http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html –

+0

Вы уверены, что делаете это правильно? Весь смысл «держателя вида» заключается в том, чтобы вы не раздували пользовательский интерфейс и не проверяли его, если он уже был кэширован для вас. Вы делаете это, устанавливая тег в своем представлении и проверяя, является ли этот тег экземпляром вашего класса ViewHolder. См. Здесь подробный пример http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html и убедитесь, что вы понимаете бит с помощью .getTag() и .setTag(). – kha

ответ

0

Вы должны проверить, если представление предусмотрено в качестве параметра в системе (так называемый convertView) равна нулю, и только в этом случае раздуть макет.

if (view == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.eachlist, viewGroup, false); 
     subject = (TextView) view.findViewById(R.id.subjectname); 
     happen=(TextView)view.findViewById(R.id.attended); 
     missed=(TextView)view.findViewById(R.id.missed); 
     percentage=(TextView)view.findViewById(R.id.Attendance); 
     ViewHolder v new ViewHolder(subject,happen,missed,percentage); 
     view.setTag(v); 
    } else { 
     ViewHolder v = (ViewHolder) view.getTag(); 
     subject=v.subject; 
     happen=v.happen; 
     missed=v.missed; 
     percentage=v.percentage; 

    } 

    .. 
    return view; 
} 
+0

Спасибо. У меня создалось впечатление, что findViewByID будет иметь более высокую сложность алгоритма, но сама идея стоимости самого инфляции мне никогда не приходила. Я просто хотел разработать свой собственный путь для кода, в итоге оказался ужасный вопрос. Спасибо, ребята. –

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