0

这个问题可能已经多次回答了,但它没有涵盖我正在寻找的内容。

我有一个带有自定义适配器的列表视图。ImageView列表视图有一个文本视图和一个附加到它的行的删除。我想在单击项目时从项目中提取文本视图的值,以便也从数据库中删除该项目。我还想更新列表项,我正在listview.setOnClickListener为此目的使用。所以我不能使用相同的删除。我已经阅读了有关使用setTag()getTag()方法的信息,但不确定如何准确地做到这一点。我想将 textview 或者更确切地说是 texview 的字符串值设置为适配器内删除 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 


            }
        });
4

2 回答 2

2

好吧,我将做一些假设,你可以告诉我哪些是错误的:

  • R.id.delete_entry 是行布局中的删除按钮
  • R.id.worklog_id 是行布局中的文本视图

如果这是真的,你希望你的 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();

    }
});
于 2012-08-02T15:18:40.273 回答
0

这就是我所做的。

用一种方法创建了一个接口。

public interface ItemRemovedListener
{
public void ItemRemoved(OrderDetails orderDetails);
}

在准备适配器时添加了实现接口的类的回调。

adapter = new CartListItemAdapter(this, R.id.listView_cart, orderDetailsList,this);

每当删除项目时调用侦听器。(在适配器类中删除按钮的点击事件中)

  itemRemovedListener.ItemRemoved(orderDetails);

处理了实现我的接口的类中的项目删除事件。

@Override
public void ItemRemoved(OrderDetails orderDetails) {
    adapter.remove(orderDetails);
    adapter.notifyDataSetChanged();
}

这解决了我的问题。我想提一下,我的删除按钮的单击事件侦听器在我的适配器类中。所以我为项目删除事件创建了一个回调。

希望这可以帮助。

于 2014-07-28T07:31:51.487 回答