Android: многоразовый адаптер и другой onclicklistener

Я хочу знать, хорошо ли использовать один и тот же адаптер для нескольких списков.

в моем коде у меня много просмотров списков, и каждый из них содержит одни и те же компоненты UL, такие как просмотр изображений и текстовый просмотр, поэтому хорошо ли использовать «MyAdapter extends BaseAdapter» для каждого из них? или лучше сделать переходник для каждого?

если мне нужно использовать один адаптер, как обрабатывать различные действия при нажатии кнопки, изображения и текста для каждого списка?

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;
    }

}

person William Kinaan    schedule 23.01.2013    source источник
comment
Да, можно использовать один и тот же адаптер несколько раз, содержащий один и тот же компонент пользовательского интерфейса, и вы можете управлять onclick самостоятельно. Просто вам нужно продумать самостоятельно, основываясь на функциональности, которую вы хотите достичь для различных действий при нажатии кнопки, изображения и т. Д.   -  person GrIsHu    schedule 23.01.2013
comment
onclick должен быть внутри getview, так как я могу сделать другой клик?   -  person William Kinaan    schedule 24.01.2013


Ответы (3)


В любом случае это не будет иметь никакого значения с точки зрения ресурсов, так как вам все равно придется создавать новый экземпляр адаптера для каждого списка. Но попытка объединить функции двух разных адаптеров в один звучит слишком сложно. Я бы сказал для ясности конструкции просто сделать два разных переходника. Это сделает вашу жизнь намного проще в долгосрочной перспективе, когда дело доходит до отладки.

Имейте в виду, что это когда поведение каждого списка различно, если предполагается, что списки функционируют одинаково, используйте один и тот же адаптер для каждого.

person Chad Campbell    schedule 23.01.2013

Вы говорите о повторном использовании экземпляра адаптера или его класса? Класс можно использовать повторно до бесконечности.

Однако экземпляр безопаснее не использовать повторно. Причина этого в том, что у вас, вероятно, будут коллизии или артефакты из предыдущего адаптера. Создание адаптера — занятие ручное, так почему бы не перестраховаться и не создать новый для каждого адаптера?

person ahodder    schedule 23.01.2013
comment
я говорю о повторном использовании класса, также я знаю, что проще создать новый адаптер для каждого списка, но под вопросом я имел в виду знать стандартный способ - person William Kinaan; 23.01.2013

Это действительно хороший вопрос, с которым я часто сталкиваюсь. Кажется таким ненужным дублирование кода адаптера только для разных действий. Я все еще борюсь с этими вопросами как с проблемой дизайна, поэтому мой ответ не предназначен для ответа на этот вопрос. Однако, что касается вопроса о повторном использовании адаптера или нет, то, что я делаю, если хочу повторно использовать список/адаптер, заключается в следующем:

Для каждого типа списка я создаю глобальное постоянное значение, которое действует как идентификатор для этого типа списка. Когда я создаю новый экземпляр адаптера, я передаю ему 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