2013-01-23 48 views
3

我想知道是否爲一個以上的listview使用相同的適配器是一種好方法。Android:可重複使用的適配器和不同的onclicklistener

在我的代碼我有很多的列表視圖,每一個包含類似的ImageView和TextView的相同UL組件,因此是很好用`MyAdapter延伸BaseAdapter`爲他們每個人的?或者爲每一個適配器更好?

,如果我不得不使用一個適配器,如何處理按鈕,ImageView的和TextView的每個列表視圖不同的onclick行動?

class MyAdapter extends BaseAdapter { 

    public MyAdapter() { 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 
+0

是的,它是可以使用含有相同的UI組件相同的適配器多次,你可以管理你自己的onclick。只需要根據自己想要實現的功能來實現按鈕,圖像視圖等不同的onclick動作即可。 – GrIsHu

+0

onclick必須位於getview內部,因此我怎樣才能使點擊不同? –

回答

0

它會使沒有什麼區別資源明智無論哪種方式,你將有反正創建適配器每個列表視圖的新實例。但試圖將兩種不同適配器的功能整合到一起,即使聽起來過於複雜。爲了清晰的設計,我會說只做兩個不同的適配器。當涉及到調試時,它會讓你的生活在長遠的過程中變得更容易。

請記住,這是在每個列表的行爲是不同的,如果名單都應該具有相同功能繼續使用同一個適配器爲每個。

0

你在談論重新使用適配器或它的類的實例?該類可以重複使用ad infinatum。

實例,但是,安全不被重用。原因是你可能會有以前AdapterView中的collsions或artifacts。適配器的創建是瑣碎的,爲什麼不安全併爲每個AdapterView創建一個新的?

+0

我說的是重用類,我也知道爲每個listview製作一個新的適配器更容易,但我的意思是通過這個問題來了解標準方法 –

0

這是一個很好的問題,我經常與之奮鬥。似乎不必要的複製這麼多的適配器代碼只是爲了不同的操作。作爲一個設計問題,我仍然在努力解決這個問題,所以我的答案無意爲此提供答案。但是,對於有關重新使用適配器或不重新使用的部分,如果我希望重用列表/適配器,我所做的是:

對於每種類型的列表,我創建一個全局常量值作爲標識符爲那種類型的列表。當我創建適配器的新實例我公司供應的requestId/listTypeId到適配器:

//first i create the constants somewhere globally 
TYPE_ID_A = 0; 
TYPE_ID_B = 1; 
TYPE_ID_C = 2 

//then i feed them to my adapter and set the clickListener on my list 
mList.setAdapter(new MyListAdapter(mContext, listData, TYPE_ID_A)); 
mList.setOnItemClickListener(this); 

在我的適配器我設置TYPEID作爲成員變量,並進一步再創建一個公共函數返回這個ID:

public class MyListAdapter extends ArrayAdapter<JSONArray> { 

    private final Context mContext; 
    private final JSONArray mItems; 
    private final int mListType; 

    //assign the values in the constructor of the adapter 
    public SearchListAdapter(Context context, JSONArray items, int listType) { 
     super(context, R.layout.item_filter_list); 
     mItems = items; 
     mContext = context; 
     mListType = listType; 
    } 

    //function to return the list id 
    public int getListType(){ 
     return mListType; 
    } 
} 

最後,我的onClick監聽器裏我把我的轉接器內這個函數返回listTypeId然後我比較全局常量以確定哪些做進一步:

@Override 
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
    MyListAdapter adapter = (MyListAdapter) adapterView.getAdapter(); 
    int listType = adapter.getListType(); //get the listTypeId now 

    //now see which list type was clicked: 
    switch(listType){ 
     case(TYPE_ID_A): 
      //to action for list A 
      break; 
     case(TYPE_ID_B): 
      //to action for list B 
      break; 
    } 
} 

這適用於我,但我不認爲它太棒了。如果任何人有其他適當的設計模式,請讓我們知道!

相關問題