如何从自定义基础适配器中删除项目?
Posted
技术标签:
【中文标题】如何从自定义基础适配器中删除项目?【英文标题】:How do I delete an item from my custom base adapter? 【发布时间】:2011-11-14 09:32:23 【问题描述】:我正在扩展 BaseAdapter 以制作自定义列表视图行。我有上下文菜单,每次用户按住该行并提示他是否要删除它时都会打开。但是如何删除该行? hashmap 只是测试数据。
private MyListAdapter myListAdapter;
private ArrayList<HashMap<String, String>> items;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
items = new ArrayList<HashMap<String,String>>();
HashMap<String, String> map1 = new HashMap<String, String>();
map1.put("date", "10/09/2011");
map1.put("distance", "309 km");
map1.put("duration", "1t 45min");
items.add(map1);
myListAdapter = new MyListAdapter(this, items);
setListAdapter(myListAdapter);
getListView().setOnCreateContextMenuListener(this);
private class MyListAdapter extends BaseAdapter
private Context context;
private ArrayList<HashMap<String, String>> items;
public MyListAdapter(Context context, ArrayList<HashMap<String, String>> items)
this.context = context;
this.items = items;
@Override
public int getCount()
return items.size();
@Override
public Object getItem(int position)
return items.get(position);
@Override
public long getItemId(int position)
return position;
@Override
public View getView(int position, View convertView, ViewGroup parent)
View view = convertView;
if (view == null)
LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.row_log, null);
TextView rowLogOverview = (TextView) view.findViewById(R.id.rowLogOverview);
HashMap<String, String> item = items.get(position);
rowLogOverview.setText(item.get("date"));
return view;
【问题讨论】:
【参考方案1】:您不要从适配器中删除!你从项目中删除!并且适配器位于您的项目和视图之间。从视图中您可以获得位置,并根据位置可以删除项目。然后适配器将刷新您的视图。
这意味着你需要做这样的事情
items.remove(position);
adapter.notifyDataSetChanged()
【讨论】:
调用adapter.notifyDataSetChanged()
绑定到items
的适配器将更新listView。【参考方案2】:
要删除,您需要做两件事:
-
在您的 ArrayList(项目)上调用
.remove()
。
在 MyListAdapter
类 (mListAdapter
) 的实例上调用 .notifyDataSetChanged()
。
【讨论】:
【参考方案3】:-
从项目中删除项目
致电
BaseAdapter.notifyDataSetChanged()
。然后列表视图将被重绘,目标行将从屏幕中移除。
【讨论】:
【参考方案4】:您应该在适配器上添加一个侦听器来处理删除事件。
public YourAdapter(Context context, List<T> rows, View.OnClickListener deleteListener)
...
然后在你的 getView() 方法上设置监听器
yourBtn.setOnClickListener(this.deleteListener);
您可以在 btn 标签上添加一个值来识别当前行:
yourBtn.setTag(position);
最后,在您的 Activity 上,您的侦听器将使用标签中的当前位置触发。然后,您可以使用之前的答案来更新您的适配器并刷新您的列表视图。
【讨论】:
【参考方案5】:在您的 BaseAdapter 中,添加代码:
public View getView(final int position, View convertView, ViewGroup parent)
View v = convertView;
LayoutInflater layoutInflater = LayoutInflater.from(this.context);
v = layoutInflater.inflate(R.layout.items, null);
TextView buttonDelete = (TextView) v.findViewById(R.id.buttonDelete);
buttonDelete.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
item.remove(position);
notifyDataSetChanged();
);
return v;
【讨论】:
以上是关于如何从自定义基础适配器中删除项目?的主要内容,如果未能解决你的问题,请参考以下文章
如何从自定义 ListView 适配器传递 Intent Extra?
我缺少啥来启用从自定义适配器到 ListView 的详细信息传输?