ListView получает касания, но onItemClickListener не получает щелчки после паузы и возобновления - PullRequest
1 голос
/ 02 марта 2012

Мы генерируем несколько ListViews, которые содержат информацию для пользователя, чтобы отфильтровать информацию в другом фрагменте.Он работает нормально, если вы не приостановите и не возобновите работу приложения (скажем, не запустите фон или не заблокируете экран).После этого список можно прокручивать, но не нажимать на него.

Код генерирования списка:

private View addList(LayoutInflater inflater, ViewGroup container, final FilterValue.SearchCategory type, final String[] labels) {
    ArrayAdapter<String> adapter = generateArrayAdapter(inflater, labels, type);
    if(adapter == null) {
        return null;
    }
    filterAdapters.add(adapter);

    ListView list = (ListView) inflater.inflate(R.layout.on_demand_filter_list, container, false);

    list.setAdapter(adapter);
    list.setItemsCanFocus(false);
    list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    list.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
    list.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(final View view, final MotionEvent motionEvent) {
            LOG.d(TAG, "NO TOUCHING!");
            return false;  //To change body of implemented methods use File | Settings | File Templates.
        }
    });
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            LOG.d(TAG, "onItemClick!");
            CheckedTextView textView = (CheckedTextView) view.findViewById(R.id.title);
            textView.toggle();
            if (textView.isChecked()) {
                filterValue.addToSelectedList(labels[i], type);
            } else {
                filterValue.removeFromSelectedList(labels[i], type);
            }
        }
    });
    list.setAdapter(adapter);
    list.setVisibility(View.GONE);
    filterListContainer.addView(list);

    return list;
}

Прослушиватель onTouch существует только для обеспечения получения касания.(Это так.) DescendantFocusability, кажется, не имеет никакого эффекта, эта ошибка существует до и после добавления.

Каждая привязана к кнопке, которая показывает или скрывает список.

    titleHeader.setOnClickListener(new View.OnClickListener() {
        public void onClick(View clickedView) {
            closeNetworkList();
            closeGenreList();
            titlesOpen = !titlesOpen;
            ImageView indicator = (ImageView) clickedView.findViewById(R.id.filter_expansion_indicator_icon);
            if (indicator != null) {
                if (titlesOpen) {
                    indicator.setImageResource(R.drawable.arrow_filter_up);
                } else {
                    indicator.setImageResource(R.drawable.arrow_filter_down);
                }
            }
            if (titlesOpen) {
                titlesListView.setVisibility(View.VISIBLE);
            } else {
                titlesListView.setVisibility(View.GONE);
            }
        }
    });

Нажмите эту кнопку, чтобы скрыть, а затем показать, что listView (созданный с помощью addList) сбрасывает что-то, и элементы можно щелкнуть снова.

XML для строки элемента:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:focusable="false"
          android:focusableInTouchMode="false"
          android:padding="8dp"
          android:orientation="horizontal">

<CheckedTextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="@drawable/on_demand_filter_checked_text_sel"
        android:gravity="center_vertical"
        android:paddingLeft="76dp"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:drawableLeft="@drawable/checkbox_sel"
        android:drawablePadding="14dp"
        style="@style/LargeRegular"/>

</LinearLayout>

Focusables являются новыми дополнениями, но ни один не работал.Проблема возникла до того, как они были добавлены.

Сам ListView:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/list"
      android:layout_width="fill_parent"
      android:layout_height="275dp"
      android:layout_marginLeft="5dp"
      android:layout_marginRight="5dp"
      android:divider="@color/Transparent"
      android:descendantFocusability="blocksDescendants"
      android:cacheColorHint="#ffffff"/>

Я в полном восторге.Никто в моей команде не имеет разумного решения этой проблемы.Работает нормально, вплоть до паузы и возобновления.Мы не делаем абсолютно ничего, что касается взглядов в резюме или паузе.Кто-нибудь может помочь?Я могу предоставить более подробную информацию по мере необходимости.

Ответы [ 2 ]

0 голосов
/ 03 марта 2012

Вспомнил, что у меня была похожая проблема с фрагментами.У меня был случай, когда запросы макета были заблокированы, они не вызывали фактического перемещения макета.Я исправил это в библиотеке Enroscar ( BaseFragment класс) со следующим фрагментом кода в классе фрагмента:

@Override
  public void onStart() {
    // ... other staff ...
    super.onStart();
    /*
      XXX I don't know the reason but sometimes after coming back here from other activity all layout requests are blocked. :(
      It looks like some concurrency issue or a views tree traversal bug
     */
    final View contentView = getActivity().findViewById(android.R.id.content);
    if (contentView != null) {
      final ViewParent root = contentView.getParent();
      if (contentView.isLayoutRequested() && !root.isLayoutRequested()) {
        if (DebugFlags.DEBUG_GUI) { Log.i("View", "fix layout request"); }
        root.requestLayout();
      }
    }
  }
0 голосов
/ 02 марта 2012

У меня была похожая проблема с моим приложением (расширенный SurfaceView, который потерял сенсорные события после возобновления), и решил ее, вызвав setFocusable (true) в реализации onResume (). Видимо, вид не получил фокус и, следовательно, не получил сенсорные события. Не уверен, так ли это, но стоит попробовать.

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