Расширение AdapterView - PullRequest
       9

Расширение AdapterView

14 голосов
/ 02 апреля 2010

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

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

Ответы [ 3 ]

3 голосов
/ 10 апреля 2013

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

0 голосов
/ 25 июля 2012

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

0 голосов
/ 02 апреля 2010

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

getView(int position, View convertView,ViewGroup group) 

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

...