使用删除按钮删除ListView元素

时间:2012-08-02 13:48:06

标签: android android-listview

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

我有一个带自定义适配器的列表视图。列表视图有一个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 


            }
        });

2 个答案:

答案 0 :(得分: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();

    }
});

答案 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事件创建了一个回调函数。

希望这有帮助。