Проблемы с прокруткой в ​​ListView внутри ScrollView - PullRequest
6 голосов
/ 24 октября 2010

Концептуально сценарий (исключая линейные разметки)

ScrollView
  Button
  Checkboxes
  Spinner
  ListView (full-size, non-scrolling)
AdMob advert

, т. Е. Панель прокрутки, в которой вверху расположен пользовательский интерфейс фильтрации, за которым следуют результаты, но реклама всегда должна оставаться видимой, а при прокрутке внизпользовательский интерфейс фильтра должен прокручиваться, оставляя максимальное пространство для результатов.

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

Но проблема, которую я вижу, заключается в том, что при необъяснимом открытии действия ScrollView немного прокручивается вниз, поэтомуListView находится в верхней части экрана.Я предполагаю, что это поведение по умолчанию, поэтому я попытался навязать положение прокрутки ScrollView наверх, но я пробовал различные методы и не вижу никакого эффекта:

scrollview.scrollTo(0, 1000/-1000);
scrollview.smoothScrollBy(0, 1000/-1000);
scrollview.fullScroll(View.FOCUS_UP);

Есть ли какие-либоспособ заставить ScrollView начать с позиции прокрутки вверху?

Если нет, то как мне получить объявление, которое не прокручивается снизу, но пользовательский интерфейс фильтра, который всегда прокручивается сверху?Использование ListView кажется излишним, поскольку мне не нужна прокрутка, но он дает много преимуществ, поэтому было бы неплохо избегать начинать с нуля и делать все самому.

Ответы [ 6 ]

1 голос
/ 24 августа 2011

Используйте следующий метод и наслаждайтесь!

    private void setListViewScrollable(final ListView list) {
    list.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            listViewTouchAction = event.getAction();
            if (listViewTouchAction == MotionEvent.ACTION_MOVE)
            {
                list.scrollBy(0, 1);
            }
            return false;
        }
    });
    list.setOnScrollListener(new OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view,
                int scrollState) {
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if (listViewTouchAction == MotionEvent.ACTION_MOVE)
            {
                list.scrollBy(0, -1);
            }
        }
    });
}

listViewTouchAction - это глобальное целочисленное значение. Если вы можете заменить линию

list.scrollBy(0, 1);

с чем-то еще, пожалуйста, поделитесь этим с нами.

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

Решением этой проблемы является фокусировка запроса на объекте в верхней части ScrollView.Например, вы можете использовать макет таблицы, оборачивая кнопку, и запросить фокус на макете таблицы (если вы сфокусируете кнопку, она изменит свой цвет).

// onCreate method
TableLayout tablelayout = (TableLayout) findViewById(R.id.tablelayout);
tablelayout.setFocusableInTouchMode(true);
tablelayout.requestFocus();
0 голосов
/ 16 октября 2011

у меня есть:

ScrollView
 TextView
 Button
 TextView
 ListView

и эта работа полезна для меня:

scrollView.smoothScrollBy(0, 0);        

без этого представления начинать с позиции списка, после чего начинать сверху

0 голосов
/ 19 апреля 2011

Я столкнулся с проблемой, когда ScrollView начинался с небольшой прокрутки вниз, поэтому было принято решение опубликовать исполняемый файл, который вызвал метод animateTo (0,0), чтобы получить список для прокрутки вверх. Я обнаружил, что это работает только при использовании anitmatTo (0,0). ScrollTo (0,0) не работает.

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

mListView.post(new Runnable(){ public void run() { mListView.animateScrollTo(0,0) });

Теперь, как все уже заявили, вы не должны делать весь ListView внутри ScrollView, но это может быть решением для вашей проблемы.

0 голосов
/ 25 октября 2010

Используйте что-то другое, кроме ListView, вы можете динамически генерировать linearLayouts, чтобы показать нужные вам данные.Вы никогда не должны использовать просмотр списка внутри scrollView, он не работает по простой причине, когда вы прокручиваете, что следует прокручивать, просмотр списка или представление прокрутки.Несколько человек из Google заявили, что не делают этого.

0 голосов
/ 24 октября 2010

Почему вы используете просмотр списка, если не прокручиваете?Почему вы не можете просто использовать линейное расположение или что-то более подходящее для этой ситуации?Вы упоминаете фильтр, вы можете очень легко свернуть свой собственный фильтр, тем более что, очевидно, у вас есть всего несколько элементов в вашем списке.

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