【问题标题】:How to manage Arraylist position?如何管理 Arraylist 位置?
【发布时间】:2015-12-04 13:29:56
【问题描述】:

我有数组列表

private ArrayList<Items> mArrayList

我已经在这个 Arraylist 中添加了项目并绑定到适配器。绑定后我得到以下输出:

position(Arraylist)   item_name
0                       abc
1                       chf
2                       tiy
3                       trf
4                       lkj
5                       xyz

所以现在我有two buttons 1)Remove and 2) undo

在删除按钮单击事件中,我正在删除项目。所以我使用了以下代码:

mArrayList.remove(0);

mItemAdapter.notifyDataSetChanged();

所以它是从 0 位置删除的项目。 之后我的数据是

position(Arraylist)   item_name

0                       chf
1                       tiy
2                       trf
3                       lkj
4                       xyz

所以现在我在下面写了撤消最后一项的代码:

item tm = (HomeScreenProduct) Object;
mArrayList.add(0, tm);
mItemdapter.notifyDataSetChanged();

所以现在最后一项没有添加到第 0 个位置。

我想当我点击撤消按钮时,最后一个被删除的项目应该设置在第 0 个位置。

所以当我点击撤消时,我想要像这样的输出

 position(Arraylist)   item_name
    0                       abc
    1                       chf
    2                       tiy
    3                       trf
    4                       lkj
    5                       xyz

因为每次移除项目后位置都会改变。

很简单,我想将最后删除的项目设置为0th position

我该怎么做?

【问题讨论】:

  • mArrayList.add(0, tm); 应该将其添加到 0 位置
  • 但它非常适合最后一项。但如果我有很多物品,它就不起作用了。
  • 请描述不工作

标签: android object arraylist android-arrayadapter


【解决方案1】:

当你删除一个项目时,你应该存储项目的值和位置。

mPositionRemoved = mPositionToRemove;
mRemovedValue = mArrayList[mPositionToRemove];
mArrayList.remove(mPositionToRemove);

撤消时:

mRemovedValue = mArrayList[mPositionToRemove];
mArrayList.add(mPositionRemoved, mRemovedValue);

这将根据需要移动以下项目

【讨论】:

    【解决方案2】:

    创建另一个临时数组列表。并且当您执行撤消操作时,在下面的临时数组列表中添加已删除的项目

    tempArraylist.clear(); 
    tempArraylist.add(item);    
    tempArraylist.addll(mainArraylist); //this will add all the rest items after 0th position
    mainArraylist= tempArraylist;
    adapter.notifyDataSetChanged();
    

    这将完成你的工作:-)

    【讨论】:

    • 我可以把mArrayList.add(0, tm);放在哪里?
    • 哦,我忘了提。对不起。您必须通过 .clear 清空您的 tempArraylist。我正在更新我的答案。并且您不必在添加时指定项目的位置。它将自动占据第 0 个位置
    • 请告诉我它崩溃的日志。我有一种感觉,你一定没有初始化 tempArraylist。
    • 我应该将 tempArraylist 设为 ArrayList&lt;Itme&gt; tempArraylist 还是 jsut Arraylist tempArraylist
    • 是的,它必须像这样初始化 ArrayList tempArraylist = new ArrayList();
    【解决方案3】:

    试试这个:

    private void remove(index){
        mArrayList.remove(index);
        mItemAdapter.notifyDataSetChanged();
    }
    
    private void undo(int index, Object object) {
        mArrayList.add(index, object);
        mItemdapter.notifyDataSetChanged();
    }
    
    private Item getItem(int index) {
        return mArrayList.get(index);
    }
    
    int index = 0;
    Item tm = getItem(index);
    
    remove(index);
    undo(index, tm);
    

    【讨论】:

    • 它有问题,比如当我第一次点击撤消按钮时,然后如果我按下删除按钮,那么它工作正常。但是当我第一次按下删除按钮然后按下撤消按钮时,它不是 wokrs。
    • 那么,如果您没有按下删除按钮,为什么要撤消,只有在删除某些内容时才需要使撤消可点击
    • 我也试过了。现在我的 mArrayList 的大小 = 6(0 到 5),当我按下删除按钮时,它将调用删除(索引),其中 index=0。之后,新的 mArrayList 大小 = 5(0 到 4),因此在按下删除按钮后第 1 个位置设置为第 0 个位置。所以当我点击撤消按钮时,它会尝试添加已经有数据的第 0 个位置。
    • 如果在索引 0 处插入,则所有其他元素索引将移动 +1 位置。我现在就测试代码
    • 哦..我有调试代码。它工作正常..但数据不再可见.!!在调试中它显示完美。
    【解决方案4】:

    好的,每个职位都会有这个问题。例如,如果您删除位置n 上的项目并且想要撤消它,则需要将每个项目从位置n 移动(复制)到n+1,从n+1n+2 等。比你可以设置将项目删除到位置n。我希望我已经清楚地描述了它:)

    // 编辑

    这只是伪代码,但它显示了我的想法

    int newPosition = pos;
    Items undoObject = tm;
    ArrayList<Items> oldList = mArrayList;
    ArrayList<Items> newList = new ArrayList<Items>();
    int i = 0;
    for(Items item : oldList) {
        if(i == newPosition) {
        newList.add(undoObject);
        } else {
        newList.add(item);
        }    
    }
    

    【讨论】:

    • 是的。逻辑上很清楚。但我无法执行此操作。我也尝试在添加到第 0 个位置后再次绑定适配器,但没有工作。
    • 你需要添加我的逻辑来撤销方法。您甚至可以使用临时列表来复制元素。您可以通过将旧列表中的元素添加到新列表中来做到这一点,当您拥有撤消位置时,您将其添加为下一个元素,之后您再次将项目从旧列表添加到新元素。这样就可以了
    • 检查我的代码。它不是 100%,但它应该告诉你我们在说什么 :)
    • 好的。我会试试看。 :-) 。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2022-01-22
    相关资源
    最近更新 更多