2013-02-27 61 views
1

我試圖填充listview,數據通過創建它的意圖傳遞給活動。您看到的println聲明確認數據正確傳遞(即打印了預期內容,這意味着適配器中引用的ArrayList已正確初始化)。不過,我一直就行了NullPointerException在填充BaseAdapter中的數據時

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

一定有什麼東西錯在適配器得到一個NullPointerException - 也許在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; 
} 

} 
} 
+0

你必須使用convertView來檢索內容,作者,日期。 – Blackbelt 2013-02-27 08:59:23

回答

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); 
+0

我曾經這樣做過,並得到相同的結果。我會再試一次,但請注意,在調用適配器之前,ArrayList已經被定義爲一個實例變量,所以我不應該這樣做,是嗎? – drewmoore 2013-02-27 08:47:53

+0

如果baseadapter類是在同一個文件中聲明的,我不認爲它需要傳遞,但是如果它在另一個文件中而不是它應該。我建議你找出第二件事實際上是空的,也許你的某個視圖是空的。嘗試調試並找出 – hardartcore 2013-02-27 08:50:11

+0

是的,它被定義爲內部類。試圖現在調試它 – drewmoore 2013-02-27 08:52:21

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); 
} 
+0

我知道這可能是一個最佳實踐,所以我把它放在那裏,但是a)據我瞭解,'getCount()'方法將ViewGroup的大小限制爲'cmts arraylist'中的項數減1 。因此,'cmts.get(position)'可能爲null會怎麼樣呢?我要求教育目的... – drewmoore 2013-02-27 08:51:16

3

您需要訪問的TextView在下面的getview方法: 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; 
} 
0

要創建這樣

CommentAdapter ca = new CommentAdapter(cmts); 

而且CommentAdapter類適配器這樣

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

創建構造函數,並在CommentAdapter類中創建局部變量

private ArrayList<Comment> cmts; 
+0

不,它不。我已經將ArrayList定義爲實例變量,並在調用適配器之前將其初始化 – drewmoore 2013-02-27 09:00:15