如何使用自定义数组适配器删除自定义列表中的特定列表项(列表行)?

How to remove a particular list item(list row) within a custom list with custom array adapter?

我是 android 的新手,我正在开发一个应用程序,我在其中扫描 NFC 卡并将 NFC 的结果字符串与列表中的值进行匹配。 所以我想要的是当 NFC 的结果匹配任何列表项时,匹配的列表项(列表行)应该被删除。 以下是自定义列表视图的代码:

public class Item {
     private String StdName;
     private String Id;
     private int img;

public Item() {

}

public Item(String name, String id, int img) {
    this.StdName = name;
    this.Id = id;
    this.img = img;
}
//getters & setters...
 ...
}

并使用自定义数组适配器

 public class ItemAdapter extends ArrayAdapter<Item>

按如下方式向列表中添加元素:

 private ArrayList<Item> m_parts = new ArrayList<Item>();
 m_parts.add(new Item(StdntId, StudentName, R.drawable.cancel));
 m_adapter = new ItemAdapter(MainActivity.this, R.layout.list_row, m_parts);
 listView.setAdapter(m_adapter);

我需要找出 Id(列表项中的一个字段)与 NFC 字符串匹配的列表项的索引,以便我可以通过索引删除列表项。 主要问题是比较结果字符串,例如“2”与自定义数组列表中的 "id" 字段,即 m_parts,它总共有 3 个字段,如(字符串 id、字符串名称、整数 img) .所以我想匹配我从感知 nfc 标签得到的字符串与 m_parts 数组列表中的 "id" 字段所以请 help/guide 我完成任务。

谢谢!!!

您需要从列表中删除该项目,然后告诉适配器它已被删除,如下所示:

this.m_parts.remove(position);
notifyItemRemoved(position);

获得职位的逻辑会因其余代码的工作方式而异。

要匹配您的字符串,只需遍历每个项目并查看它是否匹配,如果匹配,delete/remove。像这样:

public void checkAndDeleteMatchingIds(String idToMatch) {
    for (int i = 0; i < m_parts.size(); i++) {
        if (m_parts.get(i).getId().equals(idToMatch)) {
            removePart(i);
        }
    }
}

public void removePart(int position) {
    this.m_parts.remove(position);
    notifyItemRemoved(position);
}

以上代码将位于您的适配器内,扫描时调用 checkAndDeleteMatchingIds。

public interface ABPickerAnyController<E, T> {
    boolean isPicked(E expect, T iterTarget);
}

public static <E, T> T pickAnyFirst(E expect, Collection<T> collection, ABPickerAnyController<E, T> pickerController) {
    if (null == expect || ABTextUtil.isEmpty(collection)) {
        return null;
    }
    T picked = null;
    for (T t : collection) {
        if (pickerController.isPicked(expect, t)) {
            picked = t;
            break;
        }
    }
    return picked;
}

// pick the item with `id` equals `abc123`
Item item = pickAnyFirst("abc123", m_parts, new ABPickerAnyController<Item, String>(){
    @Override
    public boolean isPicked(String expect, Item iterTarget){
        return expect.equals(iterTarget.getId());
    }
})

if(null != item){
    m_parts.remove(item);
    m_adapter.notifyDataChanged();
}