Кнопка в нижнем колонтитуле представления ListView не получает события после прокрутки ListView - PullRequest
1 голос
/ 06 августа 2011

У меня есть список с каждой строкой, содержащей флажок и текст.Я успешно добавил кнопку «Ответить» в нижний колонтитул представления списка, который получает события и выдает всплывающее сообщение о том, что вы нажали кнопку «Сохранить».Проблема в том, что если представление списка можно прокручивать, и я прокручиваю представление списка вверх и вниз пару раз, кнопка «Ответ» в нижнем колонтитуле больше не активна (по крайней мере в эмуляторе).Поведение кажется таким, что кнопка вообще не реагирует ни на какие события.Однако, установка / снятие флажка в элементе представления списка вызовет событие setOnClickListener кнопки «Ответ».

View footer = View.inflate(this,R.layout.footer, null);
getListView().addFooterView(footer,null, true); 
Button btnAnswer = (Button)footer.findViewById(R.id.btnAnswer);

btnAnswer.setOnClickListener(new OnClickListener() 
{
public void onClick(View v) 
{
Toast.makeText(getApplicationContext()," You clicked Save button", Toast.LENGTH_SHORT).show();
}
});

Ответы [ 2 ]

2 голосов
/ 07 августа 2011

ListViews «повторно» используют дочерние представления для каждого элемента списка, чтобы сэкономить на потреблении памяти, времени и т. Д. Вместо воссоздания новых представлений для каждого элемента.Вы устанавливаете OnClickListener;однако, когда вы прокручиваете представление нижнего колонтитула, оно перераспределяется для другого элемента списка, и поэтому OnClickListener является недействительным.

Вам нужно будет расширить свой ListAdapter и переопределить метод getView, в котором вы хотите проверитьдля нижнего колонтитула и установите соответствующий слушатель, если он есть.

Что-то вроде:

setListAdapter(new ArrayAdapter<string>(this, R.layout.list_item, strings) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Unless you want to set each child views individually, call
        // the super
        convertView = super.getView(position, convertView, parent);

        // Check if it's the footer view
        if(position == this.getCount() - 1) {
            // Set the listener here
        }

        return convertView;
    }
});
1 голос
/ 26 февраля 2013

ваша кнопка борется за фокус с просмотром списка ... просмотр списка выигрывает ... каждый просмотр (просмотр списка и ваша кнопка) борется за фокус, поскольку у них один и тот же тип слушателя .... переключитесь на setOnTouchListener для кнопки, чтобы она заработала, и используйте onClickListener для просмотра списка

например, используя анонимный класс:

 yourfooterButton.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
             if (event.getAction() == MotionEvent.ACTION_DOWN)
                    {
                //your response code 
                    }
               }
     });

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

 mylistView.addFooterView(footerView, null, **false**);

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

...