2012-02-10 3 views
0

내 사용자 지정 목록보기 몇 가지 문제에 NullPointerException이 ..안드로이드 - 목록보기 스크롤

각 뷰가 아래로 스크롤 한 후 볼 수있는 뷰를 제외하고 잘 작동 클릭에 리스너를 가지고, 그것은 NullPointerException이 경우가 발생합니다 이 중 하나를 클릭하십시오.

이러한보기는 스크롤하기 전에 볼 수있는 경우 실제로 작동하므로 조금 혼란 스럽습니다.

사용자 지정 목록보기 내 코드는 다음과 같습니다 :

public class UserListView extends ArrayAdapter<User>{ 
int resource; 
Context context; 
String response; 

public UserListView(Context context, int resource, List<User> users){ 
    super(context,resource,users); 
    this.resource=resource; 
} 

public View getView(int position, View convertView, ViewGroup parent){ 
    LinearLayout userView; 
    User user = getItem(position); 

    userView = new LinearLayout(getContext()); 
    String inflater = Context.LAYOUT_INFLATER_SERVICE; 
    LayoutInflater layoutInflate; 
    layoutInflate = (LayoutInflater)getContext().getSystemService(inflater); 
    layoutInflate.inflate(resource, userView, true); 

    TextView name = (TextView) userView.findViewById(R.id.name); 
    RatingBar userRating = (RatingBar) userView.findViewById(R.id.userRatingBar); 
    name.setText(String.valueOf(user.getName())); 

    float percentageNumber = ((float) user.getTotalQuestionsCorrect()/(float) user.getTotalQuestionsAnswered()) * 100; 
    int percentage = (int)percentageNumber; 
    setStars(userRating, percentage); 
    userView.setId(user.getUserId()); 
    return userView; 
} 


private void setStars(RatingBar rb, int percent){ 
    RatingBar starRating = rb; 
    int percentage = percent; 

    if(percentage <= 5){starRating.setRating(0);} 
    else if(percentage < 25){starRating.setRating(1);} 
    else if(percentage >= 25 && percentage < 50){starRating.setRating(2);} 
    else if(percentage >= 50 && percentage < 75){starRating.setRating(3);} 
    else if(percentage >= 75 && percentage < 100){starRating.setRating(4);} 
    else{starRating.setRating(5);} 
} 

}

어떤 도움을 주시면 감사합니다 :) 덕분에 당신의 getView에서 일어나는 이상한 물건이 많이 있습니다

답변

1

() 메소드를 호출합니다. 나는 이것이 문제라는 것을 확신하지 못하지만 시도해 볼만한 가치가있다. 첫 번째로 convertView는 목록의 모든 항목에 대해 새보기를 유지하지 못하도록 재활용 할 수있는보기입니다. 다른 하나는 부모가 getView() 메소드에 전달 될 때 부모 뷰로 작동하도록 LinearLayout을 작성한다는 것입니다. 세 번째 이상한 점은 뷰를 펼칠 때마다 LayoutInflator를 얻는 것입니다. 당신은 정말로 한 번 생성자에서 그것을 얻은 다음 그것을 유지해야합니다.

public View getView(int position, View convertView, ViewGroup parent){ 
    User user = getItem(position); 
    if(convertView == null) 
    { 
     convertView = layoutInflate.inflate(resource, parent, false); 
    } 

    TextView name = (TextView) convertView.findViewById(R.id.name); 
    RatingBar userRating = (RatingBar) convertView.findViewById(R.id.userRatingBar); 
    name.setText(String.valueOf(user.getName())); 

    float percentageNumber = ((float) user.getTotalQuestionsCorrect()/(float) user.getTotalQuestionsAnswered()) * 100; 
    int percentage = (int)percentageNumber; 
    setStars(userRating, percentage); 
    convertView.setId(user.getUserId()); 
    return convertView; 
} 
+0

안녕 CaseyB, 그것은 작업을 가지고, 그것이 내가 여전히 당신의 설명이 :) 매우 도움이되었다 오히려 getItemAtPosition보다 getChildAt를 사용하던 내 주요 활동 내에서 문제가 있었다 밝혀 – Draynaa

0

오버라이드 getCount() 방법과 목록의 길이를 반환 :이보십시오.

public class UserListView extends ArrayAdapter<User>{ 
    int resource; 
    Context context; 
    String response; 
    List<User> users; 

    public UserListView(Context context, int resource, List<User> users){ 
     super(context,resource,users); 
     this.resource=resource; 
     this.users =users 
     } 

    @Override 
    public int getCount() { 
     return users.length; 

     } 

    } 
관련 문제