2012-08-02 203 views
0

这个问题可能已经回答了几次,但它并没有涵盖我在找什么。删除ListView元素删除按钮

我有一个自定义适配器的列表视图。该列表视图有一个textview和一个删除ImageView附加到它的行。我想从项目中提取textview的值,以便从数据库中删除该项目。我也想更新列表项目,我正在使用listview.setOnClickListener。所以我不能使用相同的删除。我已阅读使用setTag()getTag()方法,但不知道如何做到这一点。我想将texview的textview或字符串值设置为适配器内部的delete imageview的标记。然后在我的活动中使用delete.setOnClickListener内的getTag()。任何人都可以请帮我解决这个问题吗?

相关适配器代码:

@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

试试'v.getTag();'你的'onClick'里面' – Praveenkumar 2012-08-02 13:50:17

+0

@SpK我必须设置一个标签才能使用'getTag'吗? – Harsh 2012-08-02 13:52:57

+0

是的。如果您在customAdapter类中为“ImageView”设置了任何标签。 – Praveenkumar 2012-08-02 13:54:41

回答

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(); 

    } 
}); 
+0

这两个假设都是正确的。不过,我想知道如何在我从数据库中删除条目的活动中获得此ID。 – Harsh 2012-08-02 15:32:24

+0

哦我明白了。我认为你需要你的列表视图来引用回活动(然后你可以删除onClick来调用活动的删除方法);或者你在活动中拥有onClick监听器并调用v.getTag()(v应该是你的删除ImageView)。 (已更新) – xbakesx 2012-08-02 15:38:39

+0

作品!感谢您的代码:) – Harsh 2012-08-02 15:43:42

0

这里是我做的。

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

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

新增准备适配器时实现该接口的类的回调。

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

每当调用一个项目被删除的监听。 (内取出按钮的适配器类click事件)

itemRemovedListener.ItemRemoved(orderDetails); 

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

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

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

希望这会有所帮助。