1

我正在尝试listview使用通过创建它的意图传递给活动的数据来填充。您看到的println语句确认数据正确传入(即打印了预期的内容,这意味着ArrayList适配器中的引用已正确初始化)。但是,我一直NullPointerException在线

content.setText(Html.fromHtml(cmts.get(position).content));

适配器中一定有问题 - 可能在 getItem() 中,或者我的调用cmts.get(position)没有按照我的想法进行,但此时我无法弄清楚。

public class CommentsView extends Activity {
ArrayList<Comment> cmts;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_comments_view);

    cmts = (ArrayList<Comment>) getIntent().getExtras().getSerializable("clist");

    for (Comment c : cmts) {
        System.out.println("CMTinCV: " + c.content);
    }

    ListView lv = (ListView)findViewById(R.id.commentsList);

    CommentAdapter ca = new CommentAdapter();

    lv.setAdapter(ca);

}   

class CommentAdapter extends BaseAdapter {
    public CommentAdapter(){

    }
@Override
public int getCount() {
    return cmts.size()-1;
}

@Override
public Object getItem(int position) {
    return cmts.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        convertView = getLayoutInflater().inflate(R.layout.commentbox, null);

        TextView content = (TextView)findViewById(R.id.commentText);
        TextView author = (TextView)findViewById(R.id.commentAuthor);            
        TextView date = (TextView)findViewById(R.id.commentDate);     

        content.setText(Html.fromHtml(cmts.get(position).content));
        author.setText(cmts.get(position).author.name);
        date.setText(cmts.get(position).date);   
    }

    return convertView;
}

}
}
4

4 回答 4

3

您需要在 getview 方法中访问 textview,如下所示: convertView.findViewById(R.id.commentText);像这样访问它。

  @Override
   public View getView(int position, View convertView, ViewGroup parent) {
   if (convertView == null) {
    convertView = getLayoutInflater().inflate(R.layout.commentbox, null);

    TextView content = (TextView)convertView.findViewById(R.id.commentText);
    TextView author = (TextView)convertView.findViewById(R.id.commentAuthor);            
    TextView date = (TextView)convertView.findViewById(R.id.commentDate);     

    content.setText(Html.fromHtml(cmts.get(position).content));
    author.setText(cmts.get(position).author.name);
    date.setText(cmts.get(position).date);   
}
  return convertView;
 }
于 2013-02-27T08:52:34.580 回答
2

将您的适配器的构造函数更改为此(如果它不是您的活动的内部类):

ArrayList<Comment> cmts;
public CommentAdapter(ArrayList<Comment> mComments){
     this.cmts = mComments;
}

这些行:

TextView content = (TextView)findViewById(R.id.commentText);
TextView author = (TextView)findViewById(R.id.commentAuthor);            
TextView date = (TextView)findViewById(R.id.commentDate); 

应该是这样的:

TextView content = (TextView) convertView.findViewById(R.id.commentText);
TextView author = (TextView) convertView.findViewById(R.id.commentAuthor);            
TextView date = (TextView) convertView.findViewById(R.id.commentDate); 
于 2013-02-27T08:46:27.233 回答
0

首先检查变量是否为空:

if(cmts.get(position) != null) {
    content.setText(Html.fromHtml(cmts.get(position).content));
    author.setText(cmts.get(position).author.name);
    date.setText(cmts.get(position).date); 
}
于 2013-02-27T08:46:08.490 回答
0

像这样创建适配器

CommentAdapter ca = new CommentAdapter(cmts);

CommentAdapter类来创建这样的构造函数

public CommentAdapter(ArrayList<Comment> cmts){
       this.cmts = cmts;
}

并在 CommentAdapter 类中创建局部变量

 private ArrayList<Comment> cmts;
于 2013-02-27T08:56:44.270 回答