2010-04-01 3 views
14

Я пытаюсь сделать (для обучения) мою собственную реализацию простого адаптера, в котором элементы поступают из базового адаптера (ImageAdapter из образцов sdk).Расширение AdapterView

Фактический код выглядит так:

public class MyAdapterView extends AdapterView<ImageAdapter> implements AdapterView.OnItemClickListener{ 
    private ImageAdapter mAdapter; 
    public MyAdapterView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initThings(); 
    } 
    private void initThings(){ 
     setOnItemClickListener(this); 
    } 
    @Override 
    public ImageAdapter getAdapter() { 
     // TODO Auto-generated method stub 
     return mAdapter; 
    } 
    @Override 
    public void setAdapter(ImageAdapter adapter) { 
     // TODO Auto-generated method stub 
     mAdapter=adapter; 
     requestLayout(); 
    } 
    View obtainView(int position) { 
     View child = mAdapter.getView(position, null, this); 
     return child; 
    } 
    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
     for(int i=0;i<mAdapter.getCount();i++){ 
      View child = obtainView(i); 
      child.layout(10, 70*i, 70, 70); 
      addViewInLayout(child, i, null, true); 
     } 
     this.invalidate(); 
    } 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
     Log.d("MYEXAMPLES","Clicked an item!"); 
    } 
} 

Это не шедевр кодирования, он просто показывает псевдо-ListView с фотографиями. Я знаю, что я мог использовать ListView, GridView, Spinner и т. Д., Но я относительно новый для Android, и я пытаюсь выяснить некоторые вещи на нем.

Ну, вопрос здесь: Почему мой onItemClick не стреляет?

Используя тот же ImageAdapter с GridView, все работает нормально, но когда я использую класс выше, я ничего не получаю. Внутри AdapterView.java есть код для этих событий click, longclick и т. Д. ... поэтому почему я не могу просто запустить их? Возможно, я неправильно понимаю основные моменты работы AdapterView? Должен ли я распространять другие базовые классы? И почему?

Надеясь найти более опытные рекомендации здесь, спасибо заранее.

+0

есть ли у вас решение? – Riser

ответ

0

Вместо расширения AdapterView, почему вы не пытаетесь использовать baseAdapter. Когда вы обходите свой адаптер, он имеет метод, приведенный ниже.

getView(int position, View convertView,ViewGroup group) 

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

+1

Я знал о том, чтобы поместить мои собственные слушатели onClick для каждого вида адаптера, но приемлемо ли это? Я также мог сделать это внутри моего класса, добавив onClickListeners для каждого дочернего элемента после «addViewInLayout» ... Но я думал, что адаптер должен управлять только «элементами», а представление (AdapterView) должно управлять позицией, событиями и т. Д. .. Является ли тот же ListView/GridView ... их иерархия идет от AdapterView-> AbsListView-> ListView, поэтому я думал, что могу сделать что-то подобное, но он не работает ... –

0

Я играю с чем-то похожим, и я использую onItem * Выбрано * Слушатель, который может быть больше того, что вы ищете.

3

Если вы посмотрите в источниках AdapterView «s, вы увидите, что OnItemClickListener получает вызывается в методе, называется performItemClick:

public boolean performItemClick(View view, int position, long id) { 
    if (mOnItemClickListener != null) { 
     // ... 
     mOnItemClickListener.onItemClick(this, view, position, id); 
     return true; 
    } 
    return false; 
} 

Однако, если вы будете искать AdapterView источник, где этот метод , вы увидите, что он нигде не называется!

В самом деле, если вы проверить источник Gallery, например, вы увидите, что performItemClick называется в обращении с onSingleTapUp или onKeyUp событий.

Если вы хотите использовать это, вы должны обнаружить, когда пользователь нажимает на него и вызывает performItemClick по своему усмотрению.