这个问题可能已经多次得到回答,但它没有涵盖我正在寻找的内容。
我有一个带自定义适配器的列表视图。列表视图有一个textview和一个删除ImageView
附加到它的行。我想在单击项目时从项目中提取textview的值,以便从数据库中删除该项目。我还想更新列表项,我正在使用listview.setOnClickListener
来实现此目的。因此我无法使用相同的删除。我已经阅读了有关使用setTag()
和getTag()
方法但未确定如何完全执行此操作的内容。我想将textview或texview的字符串值设置为适配器内的delete imageview的标记。然后在我的活动中的getTag()
内使用delete.setOnClickListener
。有人可以帮我解决这个问题吗?
相关适配器代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
MyStringReaderHolder holder;
if(row==null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent,false);
holder= new MyStringReaderHolder();
holder.workLogID = (TextView)row.findViewById(R.id.worklog_id);
holder.delete = (ImageView) row.findViewById(R.id.delete_entry);
row.setTag(holder);
}
else
{
holder=(MyStringReaderHolder) row.getTag();
}
ViewWorkEntryBean mrb = data.elementAt(position);
holder.workLogID.setText(mrb.workLogID);
// mrb.workLogID contains the desired string which I want to pass to delete as a tag
// How do I set the tag?
return row;
}
static class MyStringReaderHolder
{
String billable;
TextView workLogID;
ImageView delete;
}
这是活动中的onClickListener:
ImageView deleteButton = (ImageView) findViewById(R.id.delete_entry);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String ID = null;
// how do I get the value of the tag into the string ID
}
});
答案 0 :(得分:2)
好吧,我会做一些假设,你可以告诉我哪些是错的:
如果这是真的,你希望你的getView代码看起来像这样:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent,false);
}
final TextView label = (TextView)row.findViewById(R.id.worklog_id);
final ImageView delete = (ImageView) row.findViewById(R.id.delete_entry);
ViewWorkEntryBean mrb = data.elementAt(position);
// set tag here
delete.setTag(mrb.workLogID);
label.setText(mrb.workLogID /* or whatever */);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// You can now get your tag value here
String ID = delete.getTag();
}
});
return row;
}
我实际上没有运行此代码...所以希望我没有犯太多骨头错误。
编辑:
然后,您可以拥有与您开始时非常相似的代码:
/** This is in your ListView class */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent,false);
}
final TextView label = (TextView)row.findViewById(R.id.worklog_id);
final ImageView delete = (ImageView) row.findViewById(R.id.delete_entry);
ViewWorkEntryBean mrb = data.elementAt(position);
// set tag here
delete.setTag(mrb.workLogID);
label.setText(mrb.workLogID /* or whatever */);
return row;
}
然后在你的活动中:
/** This is in your Activity class */
ImageView delete = /* However you were getting the current row's delete button */;
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// You can now get your tag value here
String ID = v.getTag();
}
});
答案 1 :(得分:0)
这就是我所做的。
使用一种方法创建一个接口。
public interface ItemRemovedListener { public void ItemRemoved(OrderDetails orderDetails); }
在准备适配器时添加了实现接口的类的回调。
adapter = new CartListItemAdapter(this, R.id.listView_cart, orderDetailsList,this);
每次删除项目时都会调用侦听器。 (在适配器类中删除按钮的单击事件内)
itemRemovedListener.ItemRemoved(orderDetails);
在实现my interface的类中处理了item remove事件。
@Override public void ItemRemoved(OrderDetails orderDetails) { adapter.remove(orderDetails); adapter.notifyDataSetChanged(); }
这解决了我的问题。我想提一下,我的删除按钮的click事件监听器是在我的适配器类中。所以我为item remove事件创建了一个回调函数。
希望这有帮助。