2015-05-07 82 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(); 
}