繁体   English   中英

删除 ListView 项目 - Android

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM