2015-05-07 80 views
0

我正在处理一个同时具有编辑和删除按钮的ListView,按下编辑将允许您编辑该对象,同时按下删除将显示一个对话框并确认它将删除该对象并刷新列表。一切都正常工作,直到你删除一个项目在另一个项目之前,然后在列表刷新后,当你尝试编辑该项目时,它将把你带到已删除的项目。删除Android 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,你会看到,我删除项目之前,我实际上从列表中删除它,使我更加困惑,为什么它仍然加载对象,就好像它仍然存在。

任何想法可能会造成这种情况?我将继续研究这个问题,看看我能否弄清楚发生了什么事情,但是我想我会在这里发一个帖子,然后再把我的头靠在我的桌子上。

回答

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(); 
}