Java notifyDataSetChanged()导致NullPointerException
我创建的ListView每行有两个元素(一个用于打开,另一个用于删除行)。我在主活动中创建了自定义的ListView,如下所示:Java notifyDataSetChanged()导致NullPointerException,java,android,android-listview,Java,Android,Android Listview,我创建的ListView每行有两个元素(一个用于打开,另一个用于删除行)。我在主活动中创建了自定义的ListView,如下所示: ArrayList<String> names = Devices.getInstance().getNameList(); final StableArrayAdapter adapter = new StableArrayAdapter(this,listViewResourceId,names); final ListView listview =
ArrayList<String> names = Devices.getInstance().getNameList();
final StableArrayAdapter adapter = new StableArrayAdapter(this,listViewResourceId,names);
final ListView listview = (ListView) findViewById(R.id.listView1);
listview.setAdapter(adapter);
您正在
if(convertView==null){}
块内执行所有操作。仅用于充气并将视图存储到支架。设置文本并单击此块外部的侦听器,以便它们应用于每个视图,无论是否重新循环
例如:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//--init if not re-cycled--
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row, parent, false);
convertView.setTag(new ViewHolder(
(TextView) convertView.findViewById(R.id.label),
(ImageButton) convertView.findViewById(R.id.del)
));
}
//--data to set--
String item = getItem(position);
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
StableArrayAdapter.this.mIdMap.remove(getItem(position));
StableArrayAdapter.this.notifyDataSetChanged();
}
};
//--set data--
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.text.setText(item);
holder.button.setOnClickListener(listener);
return convertView;
}
private static class ViewHolder{
public final TextView text;
public final Button button;
private ViewHolder(TextView text, Button button) {
this.text = text;
this.button = button;
}
}
试试这个
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// View view = null; remove this line
if (convertView == null) {
LayoutInflater inflator = mContext.getLayoutInflater();
view = inflator.inflate(R.layout.row, null);
}
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) convertView.findViewById(R.id.label);
viewHolder.text.setText(getItem(position));
viewHolder.button = (ImageButton) convertView.findViewById(R.id.del);
viewHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO dodanie zapytania o usuniecie
StableArrayAdapter.this.mIdMap.remove(getItem(position));
StableArrayAdapter.this.notifyDataSetChanged();
//((BaseAdapter) ((ListView)findViewById(R.id.listView1)).getAdapter()).notifyDataSetChanged();
}
});
view.setTag(viewHolder);
}
return view;
}
问题当然是愚蠢的,我试图通过从唯一的容器中删除行来删除行,但没有适当地通知整个类StableAryAdapter,而不是(在OnClickListener中): 我应该用这个:
StableArrayAdapter.this.remove(getItem(position));
我们能看一下stacktrace吗?当然很抱歉忘记了这一点:)你的适配器类带有活动类或单独的java文件?适配器类是mainacitvitySorry的嵌套类,让你等待响应-我不得不去afk。仍然是同一个问题,这是另外一个问题,但感谢您的帮助。编辑:修复后,我有其他NullPointerException-与getItemId连接-测试后,我可以看到绘图循环在查找支持删除的行ID后抛出它。我想这是因为良好的编码(可能您修复了另一个问题)值得被接受的答案。现在检查我的编辑答案,我想你必须更改viewHolder.text=(TextView)View.findViewById(R.id.label);lineProblem在程序的另一部分中-但感谢您的帮助:)
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// View view = null; remove this line
if (convertView == null) {
LayoutInflater inflator = mContext.getLayoutInflater();
view = inflator.inflate(R.layout.row, null);
}
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) convertView.findViewById(R.id.label);
viewHolder.text.setText(getItem(position));
viewHolder.button = (ImageButton) convertView.findViewById(R.id.del);
viewHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO dodanie zapytania o usuniecie
StableArrayAdapter.this.mIdMap.remove(getItem(position));
StableArrayAdapter.this.notifyDataSetChanged();
//((BaseAdapter) ((ListView)findViewById(R.id.listView1)).getAdapter()).notifyDataSetChanged();
}
});
view.setTag(viewHolder);
}
return view;
}
StableArrayAdapter.this.mIdMap.remove(getItem(position));
StableArrayAdapter.this.remove(getItem(position));