简体   繁体   English

删除 ListView 项目 - Android

[英]Removing ListView Item - Android

I am working on a app that puts some items in a list, then using a DialogFragment with the list of added items.我正在开发一个将一些项目放在列表中的应用程序,然后将DialogFragment与添加的项目列表一起使用。

I would give the option to remove these items, the problem is there.我会选择删除这些项目,问题就在那里。

I declared in OnItemClickListener that the item should be removed when clicked, the item is removed from the list normally, but soon after an IndexOutOfBoundsException bursts, it looks like a silly error but I am not finding where the problem is, the try catch block does not raise exception.我在OnItemClickListener中声明,单击时应删除该项目,该项目通常从列表中删除,但在IndexOutOfBoundsException爆发后不久,它看起来像一个愚蠢的错误,但我没有找到问题所在,try catch 块确实不引发异常。 I am a student and I do not have much experience with android, so if they can give simple answers would help me a lot.我是一名学生,我对 android 没有太多经验,所以如果他们能给出简单的答案会对我有很大帮助。

these are my codes:这些是我的代码:

DIALOG FRAGMENT the dialog opens normally and the list is displayed 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 item is removed from list and method finishes without problems ADAPTER METHOD 项目从列表中删除,方法完成没有问题

     ...     
        public void removeItem(Item item){

            for(Item i:items)               
                if(i.getIdItem()==item.getIdItem())         
                   items.remove(i);     
        }   

ERROR The error happens right after returning to DialogFragment 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)

This is why another pair of eyes is awesome, ListView has an array of items, and you are trying to remove items from an array of the item, which is not an array.这就是为什么另一双眼睛很棒的原因,ListView 有一个项目数组,而您正试图从该项目的数组中删除项目,这不是一个数组。 hence the error: What you would need to do for that is:因此错误:你需要做的是:

    public void removeItem(Item item){     
               items.remove();     
    }   

But even better and more efficient is:但更好、更高效的是:

public static class AlertDialogMyItems extends DialogFragment{公共 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
            }
        });
       ...           
    }
}

and then you could remove this part of the code:然后你可以删除这部分代码:

public void removeItem(Item item){     
           items.remove();     
}   

Because it is a bit redundant.因为有点多余。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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