Расширение адаптера

я пытаюсь сделать (в учебных целях) свою собственную реализацию простого 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? Должен ли я вместо этого расширять другие базовые классы? И почему?

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


person Ander Webbs    schedule 01.04.2010    source источник
comment
у тебя есть решение??   -  person Sagar Maiyad    schedule 11.05.2013


Ответы (3)


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

person Shade    schedule 10.04.2013

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

getView(int position, View convertView,ViewGroup group) 

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

person Rahul Patel    schedule 02.04.2010
comment
Я знал о размещении собственных прослушивателей onClick для каждого представления на адаптере, но приемлемо ли это? Я также мог бы сделать это внутри своего класса, добавляя onClickListeners к каждому дочернему элементу после addViewInLayout... Но я думал, что адаптер должен управлять только элементами, а представление (AdapterView) должно управлять позицией, событиями и т. д.... Это тот же ListView /GridView do... их иерархия идет от AdapterView->AbsListView->ListView, поэтому я подумал, что могу сделать что-то подобное, но это не работает... - person Ander Webbs; 02.04.2010

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

person Mark Gilchrist    schedule 25.07.2012