我想从json内容创建一个列表。这是我的适配器代码:
public class AnswersAdapter extends ArrayAdapter<Answer> {
static Context context;
static int layoutResourceId;
Answer data[] = null;
public AnswersAdapter(Context context, int layoutResourceId, Answer[] data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
AnswerHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new AnswerHolder();
holder.txtTitle = (TextView)row.findViewById(R.id.answerText);
holder.txtTitle2 = (TextView)row.findViewById(R.id.answerAuthor);
holder.txtTitle3 = (TextView)row.findViewById(R.id.answerVotes);
row.setTag(holder);
}
else
{
holder = (AnswerHolder)row.getTag();
}
Answer hold = data[position];
holder.txtTitle.setText(Html.fromHtml(hold.text));
holder.txtTitle2.setText(hold.author);
holder.txtTitle3.setText(hold.votes);
return row;
}
static class AnswerHolder
{
TextView txtTitle;
TextView txtTitle2;
TextView txtTitle3;
}
}
我面临这个错误:
java.lang.nullpointerexception:尝试读取空对象引用上的字段“java.lang.string com.example.shivam.stackoverflow.answer.text”
在这条线上
holder.txtTitle.setText(Html.fromHtml(hold.text));
2条答案
按热度按时间0g0grzrc1#
你的
data
数组有空值。这是npe的直接原因,因为hold
最终成为null
对于某些职位。如果您为此进行测试,您将避免使用npe,但是(正如您在注解中指出的那样)您的适配器的行为不太正常。不能简单地忽略具有null
数据值。作为旁白,你应该消除
data
成员字段。数组引用已由保留ArrayAdapter
超类。只是使用getItem(position)
无论你什么时候用data[position]
. 虽然这不会解决npe问题,但它会简化一些事情,如下所示。您有几种选择:
找出
data
是null
从根本上解决问题。但是,对于data
拥有null
条目。修改你的
getView
方法来设置视图holder
某些特定值表示“数据丢失”-可能为空,也可能是“无数据”消息(换句话说,不要简单地跳过所有处理。这就是导致空行和重复行组合的原因。)修改构造函数以消除
null
来自的条目data
. 这将导致名单缩短。实现这一点的一些代码可能是:但是,如果您需要维护
ListView
位置和原件data
数组。另一个旁白是:你可以消除
getItemId()
方法;中的默认实现ArrayAdapter
做同样的事。zaq34kh62#
把这条线改一下。。。。。
至