Это действительно хороший вопрос, с которым я часто сталкиваюсь. Кажется таким ненужным дублирование кода адаптера только для разных действий. Я все еще борюсь с этими вопросами как с проблемой дизайна, поэтому мой ответ не предназначен для ответа на этот вопрос. Однако, что касается вопроса о повторном использовании адаптера или нет, то, что я делаю, если хочу повторно использовать список/адаптер, заключается в следующем:
Для каждого типа списка я создаю глобальное постоянное значение, которое действует как идентификатор для этого типа списка. Когда я создаю новый экземпляр адаптера, я передаю ему 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 как переменную-член, а затем создаю общедоступную функцию для возврата этого идентификатора:
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;
}
}
Это работает для меня, но я не думаю, что это здорово. Если у кого-то есть другой правильный шаблон проектирования, сообщите нам об этом!
person
Chris
schedule
09.12.2014