【发布时间】: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