Java Android-从ArrayList中删除项
我有一个ArrayList,其中有6个值。单击某个按钮时,删除了其中一个值,然后向ArrayList添加了一个新值。一切都很完美,但当我找到ArrayList中的最后一个原始项并试图删除它时,应用程序崩溃了。举个例子, 我的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中的最后一个原始项。当
“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;
}