2014-12-08 3 views
0

다음은 listview에 대한 사용자 정의 목록 어댑터 코드입니다. 내 코드에서 "not null"토큰을 주석 처리하면 어댑터가 완벽하게 작동합니다. 즉, 뷰 소유자가없는 것입니다. 누군가 내가 여기있는 문제로 나를 도울 수 있습니까?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

제대로 하시겠습니까? "뷰 홀더"의 전체적인 요점은 UI를 팽창시키지 않고 이미 캐싱 된 UI를 검사하는 것입니다. 뷰에 태그를 설정하고이 태그가 ViewHolder 클래스의 인스턴스를 나타내는 지 여부를 확인하여이 작업을 수행 할 수 있습니다. 자세한 예제는 http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html을 참조하고 .getTag() 및 .setTag()를 사용하여 비트를 이해해야합니다. – kha

답변

0

당신은 시스템 (일명 convertView)에 의해 매개 변수로 제공하는 뷰가 null의 경우 확인하고, 해당 경우에 대비하여 레이아웃을 부풀게한다.

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가 더 높은 알고리즘 복잡성을 가졌을 것이라는 인상을 받고 있었지만, 인플레이션 자체의 비용에 대한 아이디어는 절대로 나에게 발생하지 않았습니다. 방금 코드에 대한 내 자신의 길을 찾고 싶다. 끔찍한 질문으로 끝났다. 여러분 께 감사드립니다. –

관련 문제