2012-02-10 67 views
0

遇到一些麻烦我的自定义列表视图..的Android - NullPointerException异常上的ListView滚动

每个视图有一个上点击监听器工作正常,除了可以向下滚动后所看到的视图,它抛出一个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);} 
} 

}

任何帮助将感谢感谢:)

回答

1

有很多怪异的东西在你的getView回事() 方法。我不确定这是否是问题,但值得一试。第一件事是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,懂了工作,原来它是从我用getChildAt而非getItemAtPosition,还是,你的解释是非常有益的:)我的主要活动范围内的问题 – Draynaa 2012-02-11 09:42:19

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; 

     } 

    } 
相关问题