如何使用自定义数组适配器删除自定义列表中的特定列表项(列表行)?
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();
}
我是 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();
}