2015-03-02 72 views
0

是的,總會有更好的方法。但是有沒有更好的方法可行? :)在Android事件處理程序中使用'this'。有沒有更好的辦法?

所以這段代碼的作品。它是一個ListActivty的自定義適配器,它的想法是每行都有一個按鈕,當點擊該按鈕時,該行的項目被刪除,列表刷新。

private class ThirdActivityAdapter extends ArrayAdapter<String> { 
    private Context ctx; 
    private List<String> items; 
    public ThirdActivityAdapter(Context ctx, List<String> items) { 
     super(ctx, R.layout.third_activity_list_row, items); 
     this.ctx = ctx; 
     this.items = items; 
    } 

    public List<String> getItems() { 
     return items; 
    } 

    @Override 
    public View getView(int position, View convertView, final ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
     View row = inflater.inflate(R.layout.third_activity_list_row, parent, false); 
     TextView txt = (TextView)row.findViewById(R.id.third_activity_list_row_text); 
     Button btn = (Button)row.findViewById(R.id.third_activity_list_row_btn); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       View view = (View)v.getParent(); 
       ListView listView = (ListView)view.getParent(); 
       ThirdActivityAdapter.this.items.remove(listView.getPositionForView(view)); 
       ThirdActivityAdapter.this.notifyDataSetChanged(); 
      } 
     }); 
     txt.setText(items.get(position)); 
     return row; 
    } 

在點擊監聽器,我使用ThirdActivityAdapter.this獲得在適配器的項目。有一個更好的方法嗎?我可以看到外部源如何工作,但我想在繼續之前看看是否有更好的設計。

謝謝!

+0

*「是的,總有一種更好的方法,但有沒有更好的方法可行?」*。如果有更好的辦法,但這是不可能的,那麼它不會是一個更好的方法。這將是...不是一種方式 – codeMagic 2015-03-02 16:37:44

+0

您不需要在items.remove或notifyDataSetChanged中使用'ThirdActivityAdapter.this'。你也可以直接做。 – Apurva 2015-03-02 16:37:55

+0

這是更好的方法。出於某種原因,我認爲「物品」不可訪問,因爲它不是最終的。 – 2015-03-02 16:55:50

回答

0

還有更好的方法,如果我正確理解你的問題。它涉及使用View.setTag(鍵,值)。它允許您將鍵值對分配給特定視圖,並稍後使用View.getTag(鍵)訪問它。

這裏是我會做:

@Override 
public View getView(int position, View convertView, final ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    View row = inflater.inflate(R.layout.third_activity_list_row, parent, false); 
    TextView txt = (TextView)row.findViewById(R.id.third_activity_list_row_text); 
    Button btn = (Button)row.findViewById(R.id.third_activity_list_row_btn); 
    btn.setTag(R.id.button_position, position); // Save position to View 
    btn.setOnClickListener(mYourClickListener); 
    txt.setText(items.get(position)); 
    return row; 
} 
View.OnClickListener mYourClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     int position = v.getTag(R.id.view_position); // Obtain position 
     removeItem(position); 
    } 
} 
// Avoids this syntax because its clear to whom this method belongs. 
private void remoteItem(int position) { 
    items.remove(position); 
    notifyDataSetChanged(); 
} 

而且,考慮使用ViewHolder模式,以避免重複findViewById()引用。

+0

這很接近。我現在無法嘗試。我認爲這將起作用。但是在click監聽器中需要獲取按鈕的父代,然後標記,因爲發送給onClick的視圖是按鈕,我需要該行,因爲這是標籤所在的位置。我想也可以在按鈕本身上設置標籤。 – 2015-03-02 16:59:11

+0

啊,我的錯,我會編輯代碼。 – 2015-03-02 17:00:46

相關問題