2010-04-29 63 views
2

這裏有一個我最近遇到的問題: 我有一個自定義的適配器類的列表視圖,適配器接受一個列表視圖並填充列表視圖中的元素。現在,我想在列表視圖的每一行上都有一個按鈕,以從中刪除項目。我應該如何處理這個問題?有沒有辦法遠程觸發活動類中的方法,並調用適配器上的notifydatachanged()方法來刷新列表視圖?ListAdapter修改數據源(這是一個arraylist)

回答

1

我做了這樣的事情:

public class MyAdapter extends Adapter { 

private final ArrayList<String> items = new ArrayList<String>(); 

// ... 

deleteRow(int position) { 
    items.remove(position); 
    notifyDataSetChanged(); 
} 
// 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if(convertView == null) { 
     Tag tag = new Tag(); 
     // inflate as usual, store references to widgets in the tag 
     tag.button.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
        deleteRow(position); 
     } 
    }); 
    } 
    // don't forget to set the actual position for each row 
    Tag tag = (Tag)convertView.getTag(); 
    // ... 
    tag.position = position; 
    // ... 
} 



class Tag { 

    int position; 

    TextView text1; 
    // ... 
    Button button; 
} 

} 
+0

很酷,你如何將修改後的數據集傳遞給活動? – dusker 2010-04-29 19:20:39

+0

你爲什麼要這樣? 'notifyDataSetChanged();'觸發ListView更新。 – yanchenko 2010-04-29 19:46:17

+0

是的,但是有什麼辦法可以將它傳遞給Activity類?或者至少序列化它,以便其他類可以訪問它? – dusker 2010-04-29 20:29:01

0

在getView()方法中,你不能只在按鈕上設置OnClickListener()嗎?

事情是這樣的:

static final class MyAdapter extends BaseAdapter { 

    /** override other methods here */ 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if (convertView == null) { 
      // inflate the view for row from xml file 

      // keep a reference to each widget on the row. 
      // here I only care about the button 
      holder = new ViewHolder(); 
      holder.mButton = (Button)convertView.findViewById(R.id.button); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

     // redefine the action for the button corresponding to the row 
     holder.mButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // do something depending on position 
       performSomeAction(position); 
       // mark data as changed 
       MyAdapter.this.notifyDatasetChanged(); 
      } 
     } 
    } 
    static final class ViewHolder { 
     // references to widgets 
     Button mButton; 
    } 
} 

如果你不確定延伸BaseAdapter,檢查出例如List14在ApiDemos。這些技術爲您提供了一種靈活的方式來修改適配器的任何方面,儘管這是非常有用的。

+0

嗨, 感謝您的幫助,這是相當多,我在這裏做什麼。 我有一個活動類,有一個數組和一個列表視圖,我有一個適配器類,我通過列表視圖和數組。現在在一個列表視圖中的一行包含一個按鈕(每行),當這個按鈕被點擊時,我需要觸發一個方法,而不是適配器類,但包含活動的類。你明白嗎? 謝謝 彼得 – dusker 2010-04-29 17:34:50