Android: невозможно получить кликабельный верхний или нижний колонтитул ListView - PullRequest
5 голосов
/ 12 января 2012

Я пытаюсь установить верхний и нижний колонтитулы в моем представлении списка, которые являются нажимаемыми кнопками.Проблема в том, что OnClickListener не отвечает ни на что, и я не могу понять, что я делаю неправильно.

$   View header = getLayoutInflater().inflate(R.layout.header_layout, null, true);
    getListView().addHeaderView(header);

    myAdapter = new myAdapter(this);

    header.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Do what I want when i click it
        }
    });

Обновление
Лучшее решение, которое я в конечном итогепридумал добавить отдельную кнопку в макет заголовка, а затем сделать это так:

View header = getLayoutInflater().inflate(R.layout.header_layout, null);
Button headerButton = (Button)header.findViewById(R.id.header_button);
getListView().addHeaderView(header);

headerButton.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
     // My Click Stuff
     }
});

Ответы [ 7 ]

9 голосов
/ 12 января 2012

Вам необходимо обработать щелчок в ListView onItemClick.Просто проверьте, является ли это первым или последним элементом в adapter, и обработайте клики таким образом.Вы должны рассматривать это как элемент в ListView.

4 голосов
/ 12 января 2012

Я вижу несколько проблем:

  • при накачивании заголовка, используйте getListView () в качестве второго параметра (root, где у вас есть ноль сейчас)быть View или ViewGroup?Я закончил тем, что использовал ViewGroup в этих ситуациях.
  • наконец - возможно, вам следует установить прослушиватель щелчков на кнопке в заголовке вместо самого заголовка?
3 голосов
/ 05 сентября 2013

Есть более простое решение:

Просто установите «OnClickListener» для примененного представления:

View view = inflater.inflate(R.layout.xxx, null);
view.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        //do something
    }
});

Очень легкая вещь, которая ее решила!

2 голосов
/ 14 июля 2015

Пример с нижним колонтитулом:

mYourListView.addFooterView(footer, null, true);

Затем в OnItemClickListener вы можете проверить:

@Override
public void onItemClick(AdapterView<?> parent,
                            View view, final int position, final long id) {

    if (id != -1) {
        // do whatever you do with list items
    } else {
        // do what you need after the footer been clicked
    }

(Если вам нужно обработать и заголовок и щелчок нижнего колонтитула, проверьте положение- 0 для заголовка и [adapter.getCount () - 1] для нижнего колонтитула)

Этот подход обеспечит такой же визуальный эффект при щелчке нижнего колонтитула, как если бы был выбран элемент списка.(Но если вам не нужен этот эффект, просто добавьте OnClickListener в нижний колонтитул, и он будет перехватывать все щелчки нижнего колонтитула)

0 голосов
/ 09 января 2015

Как говорит @LuxuryMode, вы должны обрабатывать onItemClick в ListView.Вот как это сделать:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) {

// if statement

}

Получение заголовка:

if (position == 0) { )

Получение нижнего колонтитула:

if (position == adapter.getCount()) { ) // if there is no header
if (position == adapter.getCount() + 1) { ) // if there is a header

Есть и другие способы сделать это,тоже.Вот некоторые вещи, которые вы можете сравнить:

arrayList.size() // number of items in the array (if your adapter is using an array)
cursor.getCount() // number of data items in the cursor (if your adapter is using a cursor)
adapter.getCount() // number of data items passed in by the cursor (or at least that is what a custom adapter should report)
listview.getCount() // number of data items from the adapter + a header and/or footer view

Таким образом, использование верхнего или нижнего колонтитула сделает listview.getCount () больше на 1, чем cursor.getCount ().Если вы используете как верхний, так и нижний колонтитулы, он будет больше на 2.

0 голосов
/ 26 августа 2014

Что сработало для меня:

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

myHeaderView.findViewById(R.id.myButton).setOnClickListener(new OnClickListener() { ... } );

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

mListView.addHeaderView(myHeaderView, null, true);
0 голосов
/ 26 февраля 2013

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

Существует еще одна альтернатива, и ее можно установить в нижнем колонтитуле.Была создана другая перегрузка метода, но она не появилась в документации, мне пришлось проверить онлайн документацию:

mylistView.addFooterView (footerView, null, false );

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...