我正在使用一个同时具有编辑和删除按钮的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 :(得分: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();
}