android 自定义baseadapter listview,使用自定义BaseAdapter从ListView中删除项目

本文围绕Android开发中,使用自定义BaseAdapter在ListView上显示项目时,删除列表项遇到的位置错误问题展开。作者尝试多种实现均无法正确获取删除项位置,最后给出了每次设置位置、实现OnItemClickListener接口等解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我使用自定义的BaseAdapter在ListView上显示项目。 这些项只是ArrayList中的字符串。

列表项上有一个删除按钮(大红色X),我想从ArrayList中删除该项,并通知ListView更新自己。

但是,我尝试的每个实现都会获得给它的神秘位置编号,因此例如单击项目2的删除按钮将删除项目5。 它似乎几乎完全是随机的。

需要注意的一点是元素可能会重复,但必须保持相同的顺序。 例如,我可以将“爱尔兰”两次作为元素3和7。

我的代码如下:

private static class ViewHolder { TextView lang; int position; } public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.language_link_row, null); holder = new ViewHolder(); holder.lang = (TextView)convertView.findViewById(R.id.language_link_text); holder.position = position; final ImageView deleteButton = (ImageView) convertView.findViewById(R.id.language_link_cross_delete); deleteButton.setOnClickListener(this); convertView.setTag(holder); deleteButton.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.lang.setText(mLanguages.get(position)); return convertView; }

我稍后尝试通过抓取标记来检索已删除元素的位置,但它始终是列表中的错误位置。 这里给出的位置没有明显的模式,它似乎总是随机的。

// The delete button's listener public void onClick(View v) { ViewHolder deleteHolder = (ViewHolder) v.getTag(); int pos = deleteHolder.position; ... ... ... }

我很乐意从ArrayList中删除该项并让ListView自行更新,但我得到的位置不正确所以我不能这样做。

请注意,我首先在getView方法中使用了deleteButton clickListener,并使用’position’删除了值,但我遇到了同样的问题。

任何建议表示赞赏,这真的让我很恼火。

你必须每次都设置位置。 您的实现仅在创建视图时设置位置。 但是,当视图被回收时(当convertView不为null时),位置将不会设置为正确的值。

public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.language_link_row, null); holder = new ViewHolder(); holder.lang = (TextView)convertView.findViewById(R.id.language_link_text); final ImageView deleteButton = (ImageView) convertView.findViewById(R.id.language_link_cross_delete); deleteButton.setOnClickListener(this); convertView.setTag(holder); deleteButton.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.lang.setText(mLanguages.get(position)); holder.position = position; return convertView; }

你需要实现OnItemClickListener接口,并删除onItemClick方法中的项,方法的一个参数就是位置。

我的最终解决方案是使用Greg接受的答案和以下内容:

将持有者存储在HashMap中,项目位置为键(在构造函数中初始化为空)

私有HashMap mHolders;

将其用作onClickListener方法:

public void onClick(View v) { ViewHolder deleteHolder = (ViewHolder) v.getTag(); int pos = deleteHolder.position; mHolders.remove(pos);

public void onClick(View v) { ViewHolder deleteHolder = (ViewHolder) v.getTag(); int pos = deleteHolder.position; mHolders.remove(pos);

ViewHolder currentHolder; // Shift 'position' of remaining languages // down since 'pos' was deleted for(int i=pos+1; i

[请原谅奇怪的格式。 代码嵌入无法正常工作]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值