Android-listview滚动上的nullPointerException
我的自定义listview有问题 每个视图都有一个单击侦听器,除了向下滚动后可以看到的视图外,它在单击其中一个视图时会抛出nullpointerexception 如果在滚动之前可以看到这些视图,那么它们实际上是可以工作的,所以有点混乱 自定义listview的代码如下所示:Android-listview滚动上的nullPointerException,android,listview,Android,Listview,我的自定义listview有问题 每个视图都有一个单击侦听器,除了向下滚动后可以看到的视图外,它在单击其中一个视图时会抛出nullpointerexception 如果在滚动之前可以看到这些视图,那么它们实际上是可以工作的,所以有点混乱 自定义listview的代码如下所示: public class UserListView extends ArrayAdapter<User>{ int resource; Context context; String response; pu
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);}
}
公共类UserListView扩展了ArrayAdapter{
智力资源;
语境;
字符串响应;
公共用户列表视图(上下文、int资源、列表用户){
超级(上下文、资源、用户);
这个。资源=资源;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
线性布局用户视图;
用户=获取项目(位置);
userView=newlinearlayout(getContext());
字符串充气器=Context.LAYOUT\u充气器\u服务;
LayoutInflater layoutInflate;
layoutInflate=(LayoutInflater)getContext().getSystemService(充气机);
layoutInflate.inflate(资源,用户视图,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.getTotalQuestionsRect()/(float)user.getTotalQuestionsAnswered())*100;
整数百分比=(整数)百分比数;
设置tars(用户评级,百分比);
userView.setId(user.getUserId());
返回用户视图;
}
私人无效资产(比率条rb,整数百分比){
比率条星号=rb;
整数百分比=百分比;
如果(百分比=25&&percentage<50){starRating.setRating(2);}
如果(百分比>=50&&percentage<75){starRating.setRating(3);}
如果(百分比>=75&&percentage<100){starRating.setRating(4);}
else{starting.setRating(5);}
}
}
任何帮助都将不胜感激:)谢谢在你的getView()方法中有很多奇怪的东西。我不确定这是否是问题所在,但值得一试。第一件事是convertView是一个可以循环使用的视图,它可以使您不必为列表中的每个项目使用新视图。另一种方法是创建一个LinearLayout,在将父视图传递到getView()方法时充当父视图。第三件奇怪的事情是,每次需要膨胀视图时,都会得到布局工具。你真的应该在构造函数中得到它一次,然后坚持下去。试试这个:
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;
}
重写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;
}
}
公共类UserListView扩展了ArrayAdapter{
智力资源;
语境;
字符串响应;
列出用户名单;
公共用户列表视图(上下文、int资源、列表用户){
超级(上下文、资源、用户);
这个。资源=资源;
this.users=用户
}
@凌驾
public int getCount(){
返回users.length;
}
}
Hi CaseyB,让它工作了,结果发现这是我主要活动中的一个问题,我使用的是getChildAt而不是getItemAtPosition,不过,您的解释非常有用:)