[英]Removing ListView Item - Android
我正在开发一个将一些项目放在列表中的应用程序,然后将DialogFragment
与添加的项目列表一起使用。
我会选择删除这些项目,问题就在那里。
我在OnItemClickListener
中声明,单击时应删除该项目,该项目通常从列表中删除,但在IndexOutOfBoundsException
爆发后不久,它看起来像一个愚蠢的错误,但我没有找到问题所在,try catch 块确实不引发异常。 我是一名学生,我对 android 没有太多经验,所以如果他们能给出简单的答案会对我有很大帮助。
这些是我的代码:
DIALOG FRAGMENT 对话框正常打开并显示列表
public static class AlertDialogMyItems extends DialogFragment{
MyAdapter adapter;
ListView lvMyItems;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
...
lvMyItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
Item item = (Item)adapterView.getItemAtPosition(position);
adapter.removeItem(item);
}
});
...
}
}
ADAPTER METHOD 项目从列表中删除,方法完成没有问题
...
public void removeItem(Item item){
for(Item i:items)
if(i.getIdItem()==item.getIdItem())
items.remove(i);
}
ERROR 返回 DialogFragment 后立即发生错误
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:437)
at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
at android.widget.ListView.dispatchDraw(ListView.java:3503)
at android.view.View.draw(View.java:19195)
at android.widget.AbsListView.draw(AbsListView.java:4310)
at android.view.View.updateDisplayListIfDirty(View.java:18142)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4220)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4200)
at android.view.View.updateDisplayListIfDirty(View.java:18101)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4220)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4200)
at android.view.View.updateDisplayListIfDirty(View.java:18101)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4220)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4200)
at android.view.View.updateDisplayListIfDirty(View.java:18101)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4220)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4200)
at android.view.View.updateDisplayListIfDirty(View.java:18101)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4220)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4200)
at android.view.View.updateDisplayListIfDirty(View.java:18101)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4220)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4200)
at android.view.View.updateDisplayListIfDirty(View.java:18101)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4220)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4200)
at android.view.View.updateDisplayListIfDirty(View.java:18101)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4220)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4200)
at android.view.View.updateDisplayListIfDirty(View.java:18101)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4220)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4200)
at android.view.View.updateDisplayListIfDirty(View.java:18101)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:669)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:675)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:783)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2992)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2806)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2359)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
这就是为什么另一双眼睛很棒的原因,ListView 有一个项目数组,而您正试图从该项目的数组中删除项目,这不是一个数组。 因此错误:你需要做的是:
public void removeItem(Item item){
items.remove();
}
但更好、更高效的是:
公共 static class AlertDialogMyItems 扩展 DialogFragment{
MyAdapter adapter;
ListView lvMyItems;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
...
lvMyItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
Item item = (Item)adapterView.getItemAtPosition(position);
item.remove(); // here is the change in code
}
});
...
}
}
然后你可以删除这部分代码:
public void removeItem(Item item){
items.remove();
}
因为有点多余。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.