【问题标题】:Android :delete item from grid view after drag and dropAndroid:拖放后从网格视图中删除项目
【发布时间】:2016-04-21 07:21:06
【问题描述】:

我尝试在 2 个网格视图之间拖放项目,当我放下它时,该项目已正确添加到目标列表中,但并未从源列表中删除。 这是我的功能

            @Override
        public boolean onDrag(View v, DragEvent event) {


            switch (event.getAction()) {

                case DragEvent.ACTION_DROP:

                    PassObject passObj = (PassObject)event.getLocalState();
                    View view = passObj.view;
                    Artifact passedItem = passObj.artifact;
                    List<Artifact> srcList = passObj.srcList;
                    AbsListView oldParent = (AbsListView)view.getParent();
                    ArtifactAdapter srcAdapter = (ArtifactAdapter) oldParent.getAdapter();

                    LinearLayoutAbsListView newParent = (LinearLayoutAbsListView)v;
                    ArtifactAdapter destAdapter = (ArtifactAdapter)(newParent.absListView.getAdapter());
                    List<Artifact> destList = destAdapter.getList();

                    srcList.remove(passedItem);
                    addItemToList(destList, passedItem);



                    srcAdapter.notifyDataSetChanged();
                    destAdapter.notifyDataSetChanged();

                    //smooth scroll to bottom
                    newParent.absListView.smoothScrollToPosition(destAdapter.getCount()-1);

                    break;


            return true;
        }

    };

谁能帮帮我

【问题讨论】:

    标签: android object gridview drag-and-drop


    【解决方案1】:

    创建case DragEvent.ACTION_DRAG_ENDED:,然后从原始网格中删除该项目。 ACTION_DROP 是从另一个具有不同上下文的网格视图中调用的。

    如果您 100% 确定 ACTION_DRAG_STARTED 被解雇的那一刻,您需要删除该项目使用 ACTION_DRAG_STARTED 代替。

    记住在哪个事件中哪个元素在哪个上下文中使用适配器。您的电话srcList.remove(passedItem); 可能不在正确的上下文中(Activity、Fragment、FragmentActivity...等)

    【讨论】:

    • 我得到了同样的结果:/
    • 确保您的 passedItem != null 和您在相关位置调用 revalidate() 以更新 UI 组件。 **编辑:**最佳做法是使用invalidate() 标记“脏”并需要更新的 UI 组件,当您需要“清理”这些“脏”部分时使用validate()revalidate() 使您当前的 UI 组件“变脏”并同时“清理”它。
    • 其实我可以移除带有位置(remove(positionOfpassedItem))的项目,我不知道为什么我不能使用(remove(passedItem))。我会用那个
    • 这是因为按索引删除比先搜索对象再删除要容易一些。
    猜你喜欢
    • 2012-12-22
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多