Как я могу поместить ListView в ScrollView без его разрушения? - PullRequest
345 голосов
/ 16 августа 2010

Я искал решения этой проблемы, и единственный ответ, который я могу найти, - « не помещайте ListView в ScrollView ». Я до сих пор не вижу реального объяснения почему . Кажется, единственная причина, по которой я могу найти это, заключается в том, что Google не считает, что вам следует этого делать. Ну, я так и сделал.

Итак, вопрос в том, как поместить ListView в ScrollView, не сворачивая его до минимальной высоты?

Ответы [ 27 ]

1 голос
/ 10 февраля 2016

Все эти ответы неверны !!!Если вы пытаетесь поместить представление списка в представление прокрутки, вам следует переосмыслить свой дизайн.Вы пытаетесь поместить ScrollView в ScrollView.Вмешательство в список повредит производительности списка.Он был разработан для Android таким образом.

Если вы действительно хотите, чтобы список находился в том же свитке, что и другие элементы, все, что вам нужно сделать, это добавить другие элементы в верхнюю часть списка, используяпростой оператор switch в вашем адаптере:

class MyAdapter extends ArrayAdapter{

    public MyAdapter(Context context, int resource, List objects) {
        super(context, resource, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
         ViewItem viewType = getItem(position);

        switch(viewType.type){
            case TEXTVIEW:
                convertView = layouteInflater.inflate(R.layout.textView1, parent, false);

                break;
            case LISTITEM:
                convertView = layouteInflater.inflate(R.layout.listItem, parent, false);

                break;            }


        return convertView;
    }


}

Адаптер списка может обрабатывать все, поскольку он отображает только то, что видно.

1 голос
/ 03 марта 2014

попробуйте, это работает для меня, я забыл, где я его нашел, где-то в переполнении стека, Я здесь не для того, чтобы объяснить, почему это не работает, но это ответ :).

    final ListView AturIsiPulsaDataIsiPulsa = (ListView) findViewById(R.id.listAturIsiPulsaDataIsiPulsa);
    AturIsiPulsaDataIsiPulsa.setOnTouchListener(new ListView.OnTouchListener() 
    {
        @Override
        public boolean onTouch(View v, MotionEvent event) 
        {
            int action = event.getAction();
            switch (action) 
            {
                case MotionEvent.ACTION_DOWN:
                // Disallow ScrollView to intercept touch events.
                v.getParent().requestDisallowInterceptTouchEvent(true);
                break;

                case MotionEvent.ACTION_UP:
                // Allow ScrollView to intercept touch events.
                v.getParent().requestDisallowInterceptTouchEvent(false);
                break;
            }

            // Handle ListView touch events.
            v.onTouchEvent(event);
            return true;
        }
    });
    AturIsiPulsaDataIsiPulsa.setClickable(true);
    AturIsiPulsaDataIsiPulsa.setAdapter(AturIsiPulsaDataIsiPulsaAdapter);

РЕДАКТИРОВАТЬ!, Я наконец узнал, где я получил код. Вот ! : ListView внутри ScrollView не прокручивается на Android

0 голосов
/ 25 января 2017

Эта библиотека - самое простое и быстрое решение проблемы.

0 голосов
/ 13 января 2013

Вся эта проблема просто исчезла бы, если бы у LinearLayout был метод setAdapter, потому что тогда, когда вы сказали кому-то использовать его, альтернатива была бы тривиальной.

Если вы действительно хотите прокрутить ListView внутри другого прокручиваемого представления, это не поможет, но в противном случае это, по крайней мере, даст вам представление.

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

У меня нет примера кода под рукой, но если вы хотите что-то вроде.

<ListView/>

(other content)

<ListView/>

Затем вам нужно создать адаптер, который представляет весь этот контент. ListView / Adapters достаточно умны для работы с различными типами, но вам нужно написать адаптер самостоятельно.

API пользовательского интерфейса Android не настолько развит, как все остальное, поэтому он не обладает такими же тонкостями, как другие платформы. Кроме того, когда вы делаете что-то на Android, вы должны быть настроены на Android (Unix), где вы ожидаете, что для того, чтобы делать все, что вам, вероятно, придется собирать функциональность из меньших частей и написать кучу вашего собственного кода, чтобы получить его работа.

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

Вот моя версия кода, который вычисляет общую высоту представления списка. Этот работает для меня:

   public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null || listAdapter.getCount() < 2) {
        // pre-condition
        return;
    }

    int totalHeight = 0;
    int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(BCTDApp.getDisplaySize().width, View.MeasureSpec.AT_MOST);
    int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        if (listItem instanceof ViewGroup) listItem.setLayoutParams(lp);
        listItem.measure(widthMeasureSpec, heightMeasureSpec);
        totalHeight += listItem.getMeasuredHeight();
    }

    totalHeight += listView.getPaddingTop() + listView.getPaddingBottom();
    totalHeight += (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight;
    listView.setLayoutParams(params);
    listView.requestLayout();
}
0 голосов
/ 14 марта 2016

Вместо того, чтобы помещать представление списка в Scrollview, поместите остальную часть содержимого между просмотром списка и открытием Scrollview в качестве отдельного представления и установите это представление в качестве заголовка просмотра списка.Таким образом, вы в конечном итоге получите только представление списка, взяв на себя ответственность за прокрутку.

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

Когда мы помещаем ListView внутрь ScrollView, возникают две проблемы. Один - ScrollView измеряет своих потомков в режиме НЕУТОЧНЕННЫЙ, поэтому ListView устанавливает собственную высоту для размещения только одного элемента (не знаю почему), другой - ScrollView перехватывает событие касания, поэтому ListView не прокручивает .

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

...