我已经创建了一个自定义的ListView和Adapter,通过继承BaseAdapter实现。每当我尝试在适配器上调用notifyDataSetChanged()方法时,程序会因为NullPointerException而崩溃。
以下是我的ListView和Adapter创建代码:
调用notifyDataSetChanged()时会出现NullPointerException。如果我删除此调用,则只有在按下返回按钮或显示/隐藏键盘时,列表视图才会更新(我猜这会以某种方式触发更新)。那么...我在这里做错了什么吗?
如果需要,以下是适配器的代码:
此外,错误信息为:
以下是我的ListView和Adapter创建代码:
private ArrayList<MessageItem> convList = new ArrayList<MessageItem>();
// setup list view
ListView list = (ListView)findViewById(R.id.conv_list);
MessageAdapter dataAdapter = new MessageAdapter(this, convList);
list.setAdapter(dataAdapter);
list.setVisibility(View.VISIBLE);
每当通过网络接收到新数据时,我会在AsyncTask中执行以下操作以更新listview:
protected class ConversationTask extends AsyncTask<Context, String, String>
{
@Override
protected String doInBackground(Context... arg0) {
for (;;) {
while (t_recv.messageQueue.isEmpty());
publishProgress(t_recv.messageQueue.remove(t_recv.messageQueue.size() - 1));
}
}
@Override
protected void onProgressUpdate(String... i)
{
convList.add(new MessageItem("Name", "Msg"));
dataAdapter.notifyDataSetChanged();
}
}
调用notifyDataSetChanged()时会出现NullPointerException。如果我删除此调用,则只有在按下返回按钮或显示/隐藏键盘时,列表视图才会更新(我猜这会以某种方式触发更新)。那么...我在这里做错了什么吗?
如果需要,以下是适配器的代码:
public class MessageAdapter extends BaseAdapter
{
private Context context;
private ArrayList<MessageItem> listMessage;
public MessageAdapter(Context context, ArrayList<MessageItem> listMessage) {
this.context = context;
this.listMessage = listMessage;
}
public View getView(int position, View convertView, ViewGroup viewGroup) {
MessageItem entry = listMessage.get(position);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.message, null, false);
}
TextView tvName = (TextView) convertView.findViewById(R.id.tvName);
tvName.setText(entry.getName());
TextView tvMsg = (TextView) convertView.findViewById(R.id.tvMsg);
tvMsg.setText(entry.getMsg());
return convertView;
}
public int getCount() {
return listMessage.size();
}
public Object getItem(int position) {
return listMessage.get(position);
}
public long getItemId(int position) {
return position;
}
}
列表中的每个项目都是一个“MessageItem”,如下所示:
public class MessageItem
{
private String name;
private String msg;
public MessageItem(String name, String msg) {
this.name = name;
this.msg = msg;
}
// Getter methods
public String getName() { return name; }
public String getMsg() { return msg; }
}
此外,错误信息为:
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): FATAL EXCEPTION: main
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): java.lang.NullPointerException
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at com.client.Conversation.appendMessage(Conversation.java:129)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at com.client.Conversation.access$2(Conversation.java:122)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at com.client.Conversation$ConversationTask.onProgressUpdate(Conversation.java:170)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at com.client.Conversation$ConversationTask.onProgressUpdate(Conversation.java:1)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at android.os.Handler.dispatchMessage(Handler.java:99)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at android.os.Looper.loop(Looper.java:143)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at android.app.ActivityThread.main(ActivityThread.java:5068)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at java.lang.reflect.Method.invokeNative(Native Method)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at java.lang.reflect.Method.invoke(Method.java:521)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
04-21 13:56:30.762: ERROR/AndroidRuntime(30024): at dalvik.system.NativeStart.main(Native Method)
谢谢你
AsyncTask
е®һзҺ°е‘ўпјҹдҪ зҡ„convList
жҲҗе‘ҳжҳҜеңЁе“ӘйҮҢе®ҡд№үзҡ„пјҹе®ғеә”иҜҘжҳҜдёҖдёӘзұ»зә§еҸҳйҮҸгҖӮ - rekaszeruNullPointerException
的起点。如果你能提供这些信息就更好了。在此之前,请尝试在断点处检查onProgressUpdate(String... i)
方法中访问的dataAdapter
是否有值。谢谢! - rekaszeru