Android ListView更新删除但仍指向已删除对象?

时间:2015-05-07 13:38:37

标签: android android-listview

我正在使用一个同时具有编辑和删除按钮的ListView,按下编辑将允许您编辑该对象,而按下删除将显示一个对话框,并在确认时将删除该对象并刷新列表。一切正常,直到你删除一个在另一个项目之前的项目,然后在你尝试编辑项目时刷新列表后,它将带你到被删除的项目。

示例:

第1项

第2项

我删除了第1项,所以现在我的列表如下所示:

第2项

我编辑第2项,而是显示第1项的详细信息。

来自我的ListAdapter:

private void mDeleteLineItem(final int position)
{
    final LineItem lineItem = mItems.get(position);
    FragmentManager fm = ((Activity)mContext).getFragmentManager();
    DeleteConfirmationDialogFragment deleteConfirmationDialogFragment = DeleteConfirmationDialogFragment.newInstance
    (
            mContext.getString(R.string.delete_line_item), mContext.getString(R.string.delete_line_item_confirmation_message),
            new DeleteConfirmationDialogListener() {
                @Override
                public void onConfirmDeleteButtonPressed() {
                    Log.d("LOG", "List Count Before Delete: " + mItems.size());
                    for(LineItem item : mItems)
                    {
                        Log.d("LOG", "Item Name: " + item.GetItem().GetPartNumber());
                    }
                    lineItem.delete();
                    mItems.remove(position);
                    Log.d("LOG", "List Count After Delete: " + mItems.size());
                    for(LineItem item : mItems)
                    {
                        Log.d("LOG", "Item Name: " + item.GetItem().GetPartNumber());
                    }
                    mListener.onDataSetChanged();
                    ((MainActivity)mContext).UpdateShoppingCartBubble();
                    ((MainActivity)mContext).UpdatePurchaseOrderQueueBubble();
                }

                @Override
                public int describeContents() {
                    return 0;
                }

                @Override
                public void writeToParcel(Parcel dest, int flags) {

                }
            }
    );
    deleteConfirmationDialogFragment.show(fm, "fragment_delete_confirmation");
}

从我的片段(这是创建列表的位置,我有一个监听器,允许我在删除项目时更新列表)

lineItemListAdapter.SetArrayAdapterListener(new ArrayAdapterListener()
{
    @Override
    public void onDataSetChanged()
    {
        lineItemListAdapter.notifyDataSetChanged();
        if(shoppingCartList.isEmpty())
        {
            mDisplayEmptyShoppingCart();
        }
    }
});

您可能还注意到我在删除中抛出了一些日志。在这个例子中,我正在删除M1P1,这是我得到的:

05-07 08:25:11.740    List Count Before Delete: 2
05-07 08:25:11.743    Item Name: M1P1
05-07 08:25:11.743    Item Name: C1P7
05-07 08:25:11.826    List Count After Delete: 1
05-07 08:25:11.827    Item Name: C1P7

其他可能有用的信息,我正在使用ActiveAndroid作为ORM,你会看到我在删除项目之前将其从列表中删除,这让我更加困惑为什么它仍然存在加载对象就像它仍在那里一样。

知道可能导致这种情况的原因是什么?我将继续研究这个问题,看看我是否可以弄清楚发生了什么,但是我觉得我在这里发帖子之前我已经把头撞到我的桌子上了。

1 个答案:

答案 0 :(得分:0)

我发现了这个问题,不幸的是我没有发布导致问题的方法。

viewHolder.ibEditLineItem.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        mEditLineItem(item);
    }
});

上面已经发布了,问题是这是持有该项目。所以当我把它传递给编辑项目的方法时......

private void mEditLineItem(LineItem item)
{
    Bundle bundle = new Bundle();
    bundle.putBoolean("is_edit", true);
    bundle.putInt("item_id", lineItem.GetItem().GetId());
    bundle.putLong("aa_line_item_id", lineItem.getId());
    bundle.putInt("quantity", lineItem.GetQuantity());
    bundle.putLong("aa_supplier_id", lineItem.GetSupplier().getId());

    PartDetailFragment partDetailFragment = new PartDetailFragment();
    partDetailFragment.setArguments(bundle);
    ((Activity)mContext).getFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.flFragmentSection, partDetailFragment).commit();
}

它仍然是引用已删除的项目。所以为了解决它,我现在传递列表项的位置,然后在该位置抓取当前项。更新的代码:

viewHolder.ibEditLineItem.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        mEditLineItem(position);
    }
});

private void mEditLineItem(int position)
{
    LineItem lineItem = mItems.get(position);
    Bundle bundle = new Bundle();
    bundle.putBoolean("is_edit", true);
    bundle.putInt("item_id", lineItem.GetItem().GetId());
    bundle.putLong("aa_line_item_id", lineItem.getId());
    bundle.putInt("quantity", lineItem.GetQuantity());
    bundle.putLong("aa_supplier_id", lineItem.GetSupplier().getId());

    PartDetailFragment partDetailFragment = new PartDetailFragment();
    partDetailFragment.setArguments(bundle);
    ((Activity)mContext).getFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.flFragmentSection, partDetailFragment).commit();
}