如何从列表视图中删除项目而不进行迭代

时间:2014-02-12 22:53:12

标签: android android-listview android-ui

我的列表视图中有ArrayList<Color> colorList ArrayAdapter。我的POJO是这样的:

public class Color {
 int id;
 String name;
 //getter setter
}

从服务器获取所有内容。所以每个颜色对象的id将匹配数据库表中的id

在我的ArrayAdapter's getView我正在使用数据库中的id设置标记。

    holder.imageButton.setTag(item.getId());  //color id from database
    holder.imageButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            int id = (Integer) v.getTag();  
            new DeleteColor(id).execute();
        }
    });

在上面的代码中,我将点击的项目id发送到服务器进行删除

从listView中删除项目的简便方法是什么?

我现在正在做的是:

class DeleteColor extends AsyncTask<String, String, String> {

    int id;
    public DeleteColor (int id) {
      this.id = id;
    }

    @Override
    protected String doInBackground (String ... args) {
        MyManager.INSTANCE.getService().deleteColor(id, new Callback<Integer>() {
            @Override
            public void success(Integer id, Response response) { 
                //loop through the colorlist to find which one to remove
                for (int i = 0; i < colorList.size(); i++) {
                    Color c = colorList.get(i);
                    if (c.getId() == id) {
                        colorList.remove(c);
                        adapter.notifyDataSetChanged();
                        break;
                    }
                }
            }
            @Override
            public void failure(RetrofitError retrofitError) {

            }
        });
        return "";
    }
}

正如您所看到的,我正在遍历整个colorList以查找具有我想删除的id然后删除它的那个。这是实现这一目标的好方法吗?

问题

如何避免遍历整个colorList以找到需要删除的内容。

3 个答案:

答案 0 :(得分:3)

您拥有要从列表中删除的对象的ID。 使用该id获取对象,然后使用ArrayList方法indexOf(Object object)查找列表中对象的索引并将其删除。

答案 1 :(得分:1)

技术上无法直接访问列表中的项目 在学校里,我们自己用Java建立了一个列表,它由不同的条目组成,这些条目是相互连接的。但第一个只连接到第二个,而第二个只连接到第三个。所以你甚至无法访问第二位的对象,而不是从顶部开始。要访问任何必须迭代列表的内容。

我刚刚阅读了Sound Conception的答案,我很确定indexOf(Object) - 方法本身会遍历整个列表(除非Java开发人员做了一些魔法,实际上可能是。)我不是一个专业人士,并没有调查该方法的代码)。但是手动循环可能是最有效的方式。

我不认为,执行时间存在实际差异。因此,您可能希望使用Sound Conception的方法来保持代码简单。这完全取决于你!

答案 2 :(得分:0)

如果您在视图中将项目位置设置为标记,则还有另一种方法.....

然后v.getId()会给你点击的位置,你可以直接从你的列表中删除arraylist.remove(positionclicked);