Расширение AdapterView

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

Фактический код выглядит следующим образом:

    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, GridView, Spinner и т.д., Но я относительно новый для android, и я пытаюсь выяснить некоторые вещи на нем.

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

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

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

Ответ 1

Если вы посмотрите на источники AdapterView, вы увидите, что 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 самостоятельно.

Ответ 2

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

getView(int position, View convertView,ViewGroup group) 

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

Ответ 3

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