2012-04-22 2 views
0

Я реализовал систему стека View для моего приложения Android, которое после нажатия нового представления удаляет текущее представление в целевом макете, сохраняет его в стеке, а затем добавляет новый вид в макет.Android ListView не получает события itemClick после удаления с помощью removeAllViews() и восстанавливается с помощью addView

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

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

Stack<View> viewStack; 

public View pushView(View v) { 
    // 1. Get reference to main content panel 
    LinearLayout content = (LinearLayout) findViewById(R.id.contentPanel); 
    View last = content.getChildAt(0); 
    // Pushing old to stack 
    viewStack.push(last); 

    // 2. Clear it 
    content.removeAllViews(); 

    // 3. Add new View 
    content.addView(v); 

    return last; 
} 

public View popView() { 
    if (!viewStack.isEmpty()) { 
     // 1. Get reference to main content panel 
     LinearLayout content = (LinearLayout) findViewById(R.id.contentPanel); 
     View last = content.getChildAt(0); 

     // 2. Clear it 
     content.removeAllViews(); 

     // 3. Add last View 
     content.addView(viewStack.pop()); 
     // Pushing old to stack 
     return last; 
    } else { 
     return null; 
    } 
} 

Любопытно, что другие элементы в представлении, содержащей ListView (CheckBoxes и кнопки) DO получить clickEvents. Подозреваю: 1. ListView потерял фокус, поэтому он не будет получать эти события, или 2. ListView был отсоединен от onItemClickListener

Спасибо заранее!

+0

Я думаю, что вам нужно добавить слушателя на каждый элемент, когда вы добавите его в вид – Guillaume

+0

Конечно, когда представление, содержащее ListView, создается и добавляется в первый раз, все работает. Проблема возникает при сохранении и восстановлении с помощью показанных методов. Извините, я забыл указать на то, что :) – thegraffo

+0

Хорошо, вы добавляете слушателя в первый раз, но не после? – Guillaume

ответ

0

Если вы установили «clickable» как «true» в вашем макете в xml-файле, тогда удалите его из любого места. то вы можете попробовать ...

Если вы заявляете где-нибудь тогда только. Если вы объявляете «view_name.setClickable (true)», удалите эту строку. Еще одна вещь, если вы используете ontouchlistener, тогда всегда возвращаете false. На самом деле я столкнулся с аналогичной проблемой, в которой я использовал listview и imageview в строке списка. Мое изображение получало событие клика, но listview не получал событие onitemclick, потому что я установил изображение как кликабельное в своем макете.

+0

В макете контейнера и добавленном макете нет ничего с возможностью clickable, как true. Должен ли я явно объявлять кликабельными как «ложные» для компонентов? – thegraffo

+0

Нет, если вы объявляете где-то только тогда. –