2016-04-11 62 views
1

我正在編寫一個應用程序,我有一個包含textview和一些按鈕的列表視圖。應該listview適配器也負責listview「行爲」?

在列表視圖適配器中,當我爲一個listview項目創建視圖時,我還將事件處理程序附加到按鈕上,這些按鈕的行爲嚴格取決於該列表視圖項目的textview值。

現在我的問題是,儘管在適配器中創建視圖時將事件處理程序附加到按鈕上似乎是最好的事情,但是讓事件處理程序本身位於適配器中也是一個好主意嗎?我知道它會起作用,但我更關心的是代碼管轄權分離。我覺得有點奇怪,一個適配器也包含了按鈕被觸發時的代碼。你認爲事件處理程序可以在包含listview的活動中找到更好的主頁,而不是在適配器中?你怎麼看?

+0

夥計,做我的回答可以幫助您? –

回答

1

對於我的意見 - 是的,你說得對,事件處理程序應該在Activity/Fragment,包含ListView,而不是Adapter

也許我在這種情況下的做法是不理想的,但在這裏它是:
我使適配器的接口(或外面,不管),例如

public interface MyAdapterCallback { 
     void buttonClicked(int buttonId, int position, int param2); 
    } 

當然,你可以通過儘可能多的參數,如你所願。

Adapter構造函數我傳遞對象的實例,實現此接口(Activity本身)。
然後,我的Activity實現了此接口並覆蓋了buttonClicked(),我做了所需的操作。

而在MyAdapter我把OnClickListeners按鈕,
onClick()我只是打電話_callback.buttonClicked(passing your params)


希望這個答案是有益的:)

更新。
好的,我會提供一個沒有使用接口的答案。
讓你Activity實施OnClickListener這樣的:

public class MainActivity implements View.OnClickListener{ 

    @Override 
    public void onClick(View v) { 
     //do your actions here 
    } 
} 

然後,這裏是部分地實現你的Adapter的:

public class MyAdapter extends ArrayAdapter<String> { 
    private MainActivity _mainActivity; 

    public MyAdapter(Context context, int resource, MainActivity mainActivity) { 
     super(context, resource); 
     _mainActivity = mainActivity; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button button; 
     button.setOnClickListener(_mainActivity); 
     return super.getView(position, convertView, parent); 
    } 
} 

在這種情況下,當你按下按鈕 - 鼠標點擊在MainActivity會叫做。

還有一個選項。
讓您Activity這樣的:

public class MainActivity { 
    public void onButtonInAdapterClick(your params) { 
     //do your actions here 
    } 
} 

而一個Adapter

public class MyAdapter extends ArrayAdapter<String> { 
    private MainActivity _mainActivity; 

    public MyAdapter(Context context, int resource, MainActivity mainActivity) { 
     super(context, resource); 
     _mainActivity = mainActivity; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button button; 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       _mainActivity.onButtonInAdapterClick(your params); 
      } 
     }); 
     return super.getView(position, convertView, parent); 
    } 
} 

選擇您需要的選項)

+0

對不起,我對C#有點新,所以有一部分我沒有得到..你說你傳遞接口的實例,但接口不能有實例? –

+0

我傳遞一個對象,實現這個接口(我編輯了一個答案)。是的,接口本身不能有實例。並且我的代碼是用於Java的;) –

+0

是的,我想過那個.. :)老實說,如果有一件事我必須更好地理解OOP,是接口,這就是爲什麼我會猶豫不決,以滿足您的答案。我沒有能夠判斷它的技能......:\也許如果你提出一個不使用接口的解決方案,我可能會贊成你:)謝謝你在答案中提供的細節,也許從現在開始,我可以回到這裏並且完全欣賞它。 –