【问题标题】:How to remove the selected item from Arraylist<HashMap<String, String>> in android如何从 Arraylist<HashMap<String, String>> 在android中删除选定的项目
【发布时间】:2016-04-24 12:50:09
【问题描述】:

我在 ListView 中使用Arraylist &lt; HashMap&lt; String, String &gt;&gt; 来归档多列(我只需要两列,所以我使用 HashMap)。但是当我在上下文菜单中使用删除方法时。它总是会删除列表中的最后一项。

代码:

@Override
public boolean onContextItemSelected(MenuItem item) {
    final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
    switch (item.getItemId()) {
        case R.id.bc_contextmenu_delete:
            list.remove(info.position);
            adapter.notifyDataSetChanged();
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

我应该怎么做才能解决这个问题才能从列表中删除选定的一个?

此外,我还想从 ArrayList 中的 HashMap 中获取这两个值。我应该在这里使用哪个代码。

这是一个 ArrayList:

PS4 4000<br>
PS5 5000<br>
XBOX 6000<br>

我想要 PS4 和 4000。

谢谢大家。

【问题讨论】:

  • 为什么arraylist包含hashmap?如果您需要存储键值详细信息列表,hashmap 就足够了。
  • 因为我需要一个多列列表视图。普通的列表视图每行只包含一个字符串。在这里,我需要一个可以包含多个字符串的列表视图。就像我上面展示的例子一样。 PS4 是一个字符串,4000 是另一个字符串。它们应该显示在列表视图的同一行中
  • 我认为根据您的要求采用没有字段而不是映射的新 java bean 类。例如人名和薪水,因此将来可能会添加新列,因此您必须仅在其中添加一个额外字段。

标签: java android listview arraylist hashmap


【解决方案1】:

无需将 HashMap 包装到 ArrayList 中。 HashMap 本身就足够了。如果你想保持订单,你应该使用LinkedHashMap。 副作用是您不能按索引访问元素,因此您必须对其进行迭代以获取最后一项或按索引获得的一项。

因此,如果您不关心重复项,我会使用 ArrayList 和 Pair 或自定义对象作为模板。 (我更喜欢自定义对象更具可读性)

ArrayList<Pair<String,String>> consoles = new ArrayList<Pair<String,int>>();
consoles.Add(Pair.create("PS4", 4000));
consoles.Add(Pair.create("PS5 ", 5000));
consoles.Add(Pair.create("XBOX ", 6000));

并使用索引删除:

consoles.Remove(index);

【讨论】:

  • 这似乎是一个简单的方法。但我不知道如何将其放入 listview 适配器中。我有一个问题,如果我可以把它放到 listiview 中,那么获取这些值并编辑它们是否容易?怎么做?我想这是一个列表,我应该随时将新项目添加到列表中。非常感谢!我是android的初学者。感谢您的耐心等待!
【解决方案2】:

根据您的要求,您可以创建一个相同的 bean。即 DummyBean。它有两个字段,如

class DummyBean{
String name;
String val;

--getter setter method
}

将其用于List&lt;DummyBean&gt;。 将来,如果添加了新列,那么添加和扩展就很容易了。

【讨论】:

  • 所以,如果我创建一个包含两个字段的新类。接下来我应该将一个类放入 ArrayList 对吗?那就是 ArrayList,那么如何将这两个东西分配到 ArrayList 中呢?此外,我的主要问题是我不知道如何在 ListView 的同一行中显示这两个值。非常感谢!我很抱歉问那些愚蠢的问题,但我实际上是一个编写android的初学者。感谢您的耐心等待!
【解决方案3】:

要在 ArrayList 中存储和检索 Hashmap 中的值,您需要使用键来存储 HashMap 值以识别它们

和你的例子一样,

PS4 4000
PS5 5000
XBOX 6000

  ArrayList<HashMap<String ,String>> list = new ArrayList<>();

    // to add item
    HashMap<String ,String> val = new HashMap<>();
    val.put("GAME", "PS4");
    val.put("NUMBER", "4000");
    list.add(val); //added to 0th index position

    val = new HashMap<>();
    val.put("GAME", "PS5");
    val.put("NUMBER", "5000");
    list.add(val); //added to 1st

    // to retrieve ps4 and 400
    String forPS4 = list.get(0).get("GAME");
    String for4000 = list.get(0).get("4000");

【讨论】:

  • 好的,非常感谢!我现在可以存储和检索价值了。但现在最大的问题是我不知道如何删除我选择的一行。那是当我点击 PS4 时,将显示一个上下文菜单。有两个选项:编辑和删除。这就是我要求检索值的原因,那是为了编辑部分。但是对于删除部分,如果我想删除PS4,它总是会删除XBOX。不知道是不是遇到了HashMap的问题,HashMap的顺序。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2013-05-11
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多