【问题标题】:Android - Deleting item from ArrayListAndroid - 从 ArrayList 中删除项目
【发布时间】:2014-03-04 05:32:15
【问题描述】:

我有一个包含 6 个值的 ArrayList。当我单击一个按钮时,我删除了其中一个值,然后将一个新值添加到 ArrayList。一切正常,但是当我到达 ArrayList 中的最后一个原始项目并尝试删除它时,应用程序崩溃了。这是一个例子,

我的 ArrayList 包含这些变量 "1", "2", "3","4", "5", "6" 当我按下按钮时,ArrayList 的第一项被删除,然后又添加了一项。所以,它看起来像这样,"2", "3","4", "5", "6", "New Value" 我一直这样做,直到我到达 ArrayList 中的最后一个原始项目。看起来像这样,"6", "New Value","New Value", "New Value", "New Value", "New Value" 当我点击按钮删除项目"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);

这是我用来删除和添加新 ArrayList 项的代码,

Button.setOnTouchListener(new OnTouchListener(){

            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction())
                {
                case MotionEvent.ACTION_DOWN :

                    break;
                case MotionEvent.ACTION_UP :
                    list.add("New Value");
                    list.remove(0);
                    adapter.notifyDataSetChanged();
                    break;
                }
                return false;
            }

        });

这是 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;
        }

      }

这是 CatLog,

03-04 00:28:01.586: E/AndroidRuntime(17775): java.lang.NullPointerException
03-04 00:28:01.586: E/AndroidRuntime(17775):    at com.example.LoginActivity$StableArrayAdapter.getItemId(LoginActivity.java:183)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.widget.AdapterView.rememberSyncState(AdapterView.java:1169)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:798)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:5630)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:35)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:286)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at com.example.LoginActivity$2.onTouch(LoginActivity.java:157)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.View.dispatchTouchEvent(View.java:5574)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1965)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1734)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1965)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1734)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1965)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1734)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1965)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1734)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1965)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1734)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1982)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1441)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.app.Activity.dispatchTouchEvent(Activity.java:2421)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1930)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.View.dispatchPointerEvent(View.java:5759)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2970)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2529)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:869)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2538)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.os.Looper.loop(Looper.java:154)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at android.app.ActivityThread.main(ActivityThread.java:4945)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at java.lang.reflect.Method.invokeNative(Native Method)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at java.lang.reflect.Method.invoke(Method.java:511)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-04 00:28:01.586: E/AndroidRuntime(17775):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你为什么使用 OnTouchListener ?
  • OnTouchListener 是我已经为其他东西创建的按钮,我不想创建新按钮,所以我只是将代码放入其中。

标签: java android android-listview arraylist android-arrayadapter


【解决方案1】:

你的代码是..

    @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;
}

}

【讨论】:

    【解决方案2】:

    您还需要将getItem 中的StableArrayAdapter 适配器覆盖为:

    @Override
    public String getItem(int position) {
        return objects.get(position);
    }
    

    因为默认getItem方法返回null

    编辑:

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

      for (int i = 0; i < objects.size(); i++) {
        mIdMap.put(objects.get(i), i);
      } 
    

    【讨论】:

    • 但为什么 OP 在第 6 次尝试时获得 NPE?为什么不先? OP 说I am getting NPE when trying to remove 6...
    • @GopalRao :我的回答是根据 logcat 所说的而不是 OP 所说的
    • 我的getItem 中的StableArrayAdapter 不是已经有@Override 了吗?抱歉,我只是不完全了解我需要将代码更改为什么。
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2023-03-15
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多