Java Android-从ArrayList中删除项

Java Android-从ArrayList中删除项,java,android,android-listview,arraylist,android-arrayadapter,Java,Android,Android Listview,Arraylist,Android Arrayadapter,我有一个ArrayList,其中有6个值。单击某个按钮时,删除了其中一个值,然后向ArrayList添加了一个新值。一切都很完美,但当我找到ArrayList中的最后一个原始项并试图删除它时,应用程序崩溃了。举个例子, 我的ArrayList包含这些变量“1”、“2”、“3”、“4”、“5”、“6”当我按下按钮时,ArrayList的第一项被删除,然后添加另一项。因此,它看起来是这样的,“2”、“3”、“4”、“5”、“6”、“新值”我一直这样做,直到找到ArrayList中的最后一个原始项。当

我有一个ArrayList,其中有6个值。单击某个按钮时,删除了其中一个值,然后向ArrayList添加了一个新值。一切都很完美,但当我找到ArrayList中的最后一个原始项并试图删除它时,应用程序崩溃了。举个例子,

我的ArrayList包含这些变量
“1”、“2”、“3”、“4”、“5”、“6”
当我按下按钮时,ArrayList的第一项被删除,然后添加另一项。因此,它看起来是这样的,
“2”、“3”、“4”、“5”、“6”、“新值”
我一直这样做,直到找到ArrayList中的最后一个原始项。当我点击按钮删除项目时,
“6”、“新值”、“新值”、“新值”、“新值”
应用程序崩溃

这是我的ArrayList代码

String[] values = new String[] { "1", "2", "3",
                "4", "5", "6" };  
        final ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < values.length; ++i) {
          list.add(values[i]);
        }
        final StableArrayAdapter adapter = new StableArrayAdapter(this,
            R.layout.main_activity_list_item, list);
        listview.setAdapter(adapter);
这是StableArrayAdapter

private class StableArrayAdapter extends ArrayAdapter<String> {

        HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

        public StableArrayAdapter(Context context, int textViewResourceId,
            List<String> objects) {
          super(context, textViewResourceId, objects);
          for (int i = 0; i < objects.size(); ++i) {
            mIdMap.put(objects.get(i), i);
          }
        }

        @Override
        public long getItemId(int position) {
          String item = getItem(position);
          return mIdMap.get(item);
        }

        @Override
        public boolean hasStableIds() {
          return true;
        }

      }

您还需要将
stablerayadapter
Adapter中的
getItem
重写为:

@Override
public String getItem(int position) {
    return objects.get(position);
}
因为默认情况下
getItem
方法返回
null

编辑:

在地图中添加元素是
i
的预增量,而不是Post as:

  for (int i = 0; i < objects.size(); i++) {
    mIdMap.put(objects.get(i), i);
  } 
for(int i=0;i
您的代码是

    @Override
    public long getItemId(int position) {
      String item = getItem(position);
      return mIdMap.get(item);
    }
你会做出这样的改变

    @Override
    public long getItemId(int position) {       
      return position;
    }
get item id意味着它将返回一个位置,这是您将使用的所有自定义适配器,就像这样,它将对您有用

public class CustomAdapter extends ArrayAdapter<String> {

public ArrayList<String> mlist;
public Context context;
public LayoutInflater inflater;

public CustomAdapter(Context context, int resource, ArrayList<String> mlist) {
    super(context, resource);
    this.mlist = mlist;
    this.context = context;
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getPosition(Sample item) {
    return super.getPosition(item);
}

@Override
public Sample getItem(int position) {
    return mlist.get(position);
}

@Override
public int getCount() {
    return mlist.size();
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = inflater.inflate(R.layout.listitem, null);
    TextView text1 = (TextView) convertView.findViewById(R.id.item1);       
    text1.setText(mlist.get(position).getListitem1());      
    return convertView;
}
公共类CustomAdapter扩展了ArrayAdapter{
公共阵列列表;
公共语境;
公共场所;充气机;
公共CustomAdapter(上下文上下文、int资源、ArrayList mlist){
超级(上下文、资源);
this.mlist=mlist;
this.context=上下文;
充气器=(充气器)上下文
.getSystemService(上下文布局\充气机\服务);
}
@凌驾
公共int getPosition(示例项){
返回super.getPosition(项目);
}
@凌驾
公共示例getItem(int位置){
返回mlist.get(位置);
}
@凌驾
public int getCount(){
返回mlist.size();
}
@凌驾
公共长getItemId(int位置){
返回super.getItemId(位置);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
convertView=充气机。充气(R.layout.listitem,null);
TextView text1=(TextView)convertView.findViewById(R.id.item1);
text1.setText(mlist.get(position.getListitem1());
返回视图;
}

}

为什么要使用OnTouchListener?OnTouchListener是我为其他东西创建的按钮,我不想创建新按钮,所以我只是将代码放在其中。但为什么要在第六次尝试时获得NPE?为什么不先呢?OP说当试图删除6时,我得到了NPE,
。@GopalRao:我的答案是根据logcat所说的而不是OP所说的,
stablerayadapter
中不是我的
getItem
已经有了
@Override
?对不起,我只是没有完全理解我需要将代码更改为什么。
    @Override
    public long getItemId(int position) {       
      return position;
    }
public class CustomAdapter extends ArrayAdapter<String> {

public ArrayList<String> mlist;
public Context context;
public LayoutInflater inflater;

public CustomAdapter(Context context, int resource, ArrayList<String> mlist) {
    super(context, resource);
    this.mlist = mlist;
    this.context = context;
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getPosition(Sample item) {
    return super.getPosition(item);
}

@Override
public Sample getItem(int position) {
    return mlist.get(position);
}

@Override
public int getCount() {
    return mlist.size();
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = inflater.inflate(R.layout.listitem, null);
    TextView text1 = (TextView) convertView.findViewById(R.id.item1);       
    text1.setText(mlist.get(position).getListitem1());      
    return convertView;
}