Android: ListView в PopupWindow не может быть выбран - PullRequest
2 голосов
/ 06 января 2012

Я устанавливаю макет с списком на всплывающее окно , а затем я устанавливаю popupwindow.setFocusale(false); и добавляю атрибут "android:focusable="true"" к просмотр списка после этого я нажимаю просмотр списка во всплывающем окне , элемент в просмотре списка не может быть выбран, может кто-нибудь подсказать решение?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2014

У меня была такая же проблема, и в моем случае PopupWindow.setFocusble(false) требовалось (и использование ListPopupWindow не было решением в моем случае, так как многие вещи в проекте уже использовали функциональность base PopupWindow, включая расширение ).

Если у кого-то в той же ситуации есть обходной путь, основанный на обсуждении ошибки, здесь (пост # 9)

Основная идея заключается в том, что иерархия ListView по-прежнему получает сенсорные события, поэтому мы можем вручную вызвать onItemClick().

Однако этот подход не на 100% идентичен реальной обработке касаний ListView (как будто при нажатии на строку не происходит свечение выделения), на данный момент для меня это довольно неплохо.

Если у кого-то есть более точное решение этой проблемы, поделитесь.

Итак, вот полный код Adapter, который можно использовать с ListView внутри PopupWindow, то есть setFocusable(false):

закрытый класс CustomAdapter расширяет ArrayAdapter {

private LayoutInflater mInflater;
private ListView mOwningListView;

public CustomAdapter(Context context, List<String> objects, ListView listView) {
    super(context, android.R.layout.simple_list_item_1, objects);
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mOwningListView = listView;
}


@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.font_pick_row, null);
    }
    // this is the key point of workaround
    convertView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            /*
             *  as every row is still receiving their touches
             *  we can use this to manually trigger onItemClick
             *  since it doesn't firing in popupWindow.setFocusable(false)  
             */
            mOwningListView.getOnItemClickListener().onItemClick(mOwningListView, v, position, getItemId(position));

        }
    });
    //... other stuff
    return convertView;
}

}

0 голосов
/ 06 января 2012

почему вы заставляете всплывающее окно фокусироваться на ложь ... влияет ли это на ваш пользовательский интерфейс, если он оставил focussable. Я думаю, именно поэтому ListView не получает фокус.

...