2012-08-02 160 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(); 
} 

這解決了我的問題。我想提到我的適配器類中的刪除按鈕的單擊事件偵聽器。所以我爲項目刪除事件創建了一個回調。

希望這會有所幫助。