Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java notifyDataSetChanged()导致NullPointerException_Java_Android_Android Listview - Fatal编程技术网

Java notifyDataSetChanged()导致NullPointerException

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 =

我创建的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));