Менталитет Google: ListView в ScrollView

Я один из бедных новичков, которые хотели поместить ListView в ScrollView.

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

listView.setScrollContainer(false) казался решением (потому что я думал, что он может отключить возможность прокрутки ListView), но не повезло.

Так может ли кто-нибудь объяснить, почему Google не позволяет listViews не прокручиваться - есть ли способ сделать это, о котором этот тупица просто не замечает?


person jcuenod    schedule 10.01.2011    source источник
comment
Если это менталитет Google, то почему вы предпочли изучать Android?   -  person Paresh Mayani    schedule 18.10.2013


Ответы (2)


Как сказала Майра, вам следует переосмыслить свой пользовательский интерфейс.

Если у вас нет нескольких ListView, я могу найти решение вашей проблемы. Поскольку у вас, кажется, есть только одно представление списка в представлении прокрутки. Это означает, что вы хотели разместить что-то сверху или снизу.

У вас есть setHeader, setFooter. Туда просто нужно положить все, что угодно. Вы должны добавить эти представления перед setAdapter ().

Если у вас есть несколько ListView в вашем scrollview. У меня есть для вас второе решение. Я не могу вдаваться в подробности. Но вам нужно будет создать собственный адаптер и переопределить ViewTypeCount, чтобы вы могли обрабатывать несколько типов элементов. Так вы сможете загружать через адаптер все, что захотите. И все, что вам действительно нужно, это ListView.

Если вы хотите обрабатывать несколько типов элементов (несколько списков), вот пример «непроверенный».

Вы должны создать подкласс адаптера и переопределить getView. Обычно у нас должно быть что-то похожее на то, что для утилизации просмотра

if(view == null){
    //inflate view
}

В вашем случае вам нужно это сделать.

package com.neutrino.lvt;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class Main extends Activity {
    private ListView lv;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lv = (ListView)findViewById(R.id.lv);

        ArrayList<Items> items = new ArrayList<Items>();

        items.add(new ItemA("Une"));
        items.add(new ItemA("Une3"));
        items.add(new ItemA("Une4"));
        items.add(new ItemA("Une5"));
        items.add(new ItemA("Une6"));
        items.add(new ItemA("Une7"));
        items.add(new ItemA("Une8"));
        items.add(new ItemA("Une9"));
        items.add(new ItemA("Une0"));
        items.add(new ItemA("Une0-"));
        items.add(new ItemB("bbb", "cc1c"));
        items.add(new ItemB("bbb3", "c2cc"));
        items.add(new ItemB("bbb4", "c2cc"));
        items.add(new ItemB("bbb5", "c1cc"));
        items.add(new ItemB("bbb6", "cc5c"));
        items.add(new ItemB("bbb7", "cc4c"));
        items.add(new ItemB("bbb7", "c2cc"));
        items.add(new ItemB("bbb8", "c1cc"));
        items.add(new ItemB("bbb9", "cc6c"));
        items.add(new ItemB("bbb0", "cc8c"));
        items.add(new ItemB("bbb0", "cc0c"));
        items.add(new ItemB("bb3b", "cc6c"));
        items.add(new ItemA("Une"));
        items.add(new ItemA("Une3"));
        items.add(new ItemA("Une4"));
        items.add(new ItemA("Une5"));
        items.add(new ItemA("Une6"));
        items.add(new ItemA("Une7"));
        items.add(new ItemA("Une8"));
        items.add(new ItemA("Une9"));
        items.add(new ItemA("Une0"));
        items.add(new ItemA("Une0-"));
        items.add(new ItemB("bbb6", "cc5c"));
        items.add(new ItemB("bbb7", "cc4c"));
        items.add(new ItemB("bbb7", "c2cc"));
        items.add(new ItemB("bbb8", "c1cc"));
        items.add(new ItemB("bbb9", "cc6c"));
        items.add(new ItemB("bbb0", "cc8c"));
        items.add(new ItemB("bbb0", "cc0c"));
        items.add(new ItemB("bb3b", "cc6c"));

        SpecialAdapter b = new SpecialAdapter(this, items);
        lv.setAdapter(b);

    }

    private class SpecialAdapter extends BaseAdapter{

        List<Items> list;
        Context context;

        public SpecialAdapter(Context context, List<Items> list) {
            this.list = list;
            this.context = context;
        }

        public Context getContext(){
            return this.context;
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Items getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return list.get(position).hashCode();
        }

        @Override
        public int getViewTypeCount() {
            return 2;
        }

        @Override
        public int getItemViewType(int position) {
            Items b = getItem(position);
            if(b instanceof ItemA){
                return 0;
            }else{
                return 1;
            }
        }



        @Override
        public View getView(int position, View v, ViewGroup parent) {
            Items o = getItem(position);
            if(v == null){
                LayoutInflater vi = (LayoutInflater)this.getContext()
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);     
                if(getItemViewType(position) == 0){
                    v = vi.inflate(
                                     android.R.layout.simple_list_item_multiple_choice,
                                     null
                                    );
                    Log.i(this.getClass().getName(), 
                                        "Inflate two line"
                                    );
                }else{
                    v = vi.inflate(
                                     android.R.layout.two_line_list_item, 
                                     null
                                    );
                    Log.i(this.getClass().getName(), 
                                     "Inflate one line"
                                    );
                }
            }

            switch (getItemViewType(position)) {
            case 0:
                ItemA oa = (ItemA)o;
                ((TextView)v.findViewById(android.R.id.text1)).setText(oa.toString());
                break;
            case 1:
                ItemB ob = (ItemB)o;
                ((TextView)v.findViewById(android.R.id.text1)).setText(ob.toString());
                ((TextView)v.findViewById(android.R.id.text2)).setText(ob.getClasse());
                break;
            }
            return v;
        }

    }

    private abstract class Items {}

    private class ItemA extends Items {
        String name;

        public ItemA(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "ItemA: " + name;
        }
    }

    private class ItemB extends Items {
        private String name;
        private String classe;

        public ItemB(String name, String classe) {
            this.name = name;
            this.classe = classe;
        }

        public String getClasse(){
            return classe;
        }

        @Override
        public String toString() {
            return "ItemB: " + name;
        }
    }
}

Постараюсь написать образец и скоро придумываю обновление. Я думаю, что мне чего-то не хватает, потому что при повторном использовании представлений необходимо проверить, соответствует ли переработанное представление ItemType. Но вы определенно можете сделать это только с помощью ListView. Прокрутка не требуется.

person Loïc Faure-Lacroix    schedule 10.01.2011
comment
На самом деле я хочу использовать адаптивность ListView - способ, которым я могу быстро вставлять и удалять элементы (по индексу) с помощью адаптера. Если есть способ сделать это с помощью LinearLayout, дайте мне знать. Но мне нужно более одного ListView, поэтому я хотел поместить оба в ScrollView (на самом деле я даже не хочу, чтобы ListViews прокручивались). - person jcuenod; 11.01.2011
comment
Подскажите, кажется ли код понятным? Вам необходимо обрабатывать несколько типов представлений 1 для каждого из представленных списков, которые у вас были. И вы даже можете добавить сортировку к своим элементам, чтобы ItemA всегда был поверх ItemB. - person Loïc Faure-Lacroix; 12.01.2011
comment
В этом есть смысл - но это моя точка зрения. Почему Google не разрешает только вложенные прокручиваемые элементы? Позвольте нам принимать решения по пользовательскому интерфейсу, и если мы потерпим неудачу, пусть будет так, но дайте нам функциональность ... Я понимаю ваш код, но я считаю, что в нем нет необходимости. - person jcuenod; 12.01.2011
comment
@ j3frea Зачем Google тратить время на реализацию чего-то, что, как они знают, будет действительно неприятным для пользователей? Есть много других вещей, на которых они могут сосредоточиться, которые будут полезны гораздо большему количеству людей. - person Cheryl Simon; 12.01.2011
comment
@ j3frea есть веская причина, почему это невозможно. Скроллер не перерабатывает просмотры. ListView перерабатывает просмотры и эффективно использует память. Если бы представление списка было развернуто с возможностью прокрутки, не было бы повторения просмотра, если у вас есть 100 элементов, это равно как минимум 100 представлениям в памяти. В моем коде выше было бы не более 20 просмотров для 20, 100, 1000 элементов. Так что да, код, который я опубликовал, необходим. Представление скроллера не может ничего переработать само по себе. - person Loïc Faure-Lacroix; 13.01.2011
comment
@Mayra только потому, что пользовательский интерфейс может не работать на экране 3.5, не означает, что он не будет работать на экране 10. - person jcuenod; 13.01.2011
comment
Что ж, на самом деле вы все еще довольно ограничены разрешением экрана, но, конечно же, на 10-дюймовом экране оно будет более удобным для пальцев. - person Loïc Faure-Lacroix; 14.01.2011

Вы можете использовать LinearLayout в качестве не прокручиваемого ListView. Большая сила ListView в том, как он справляется с отложенной загрузкой элементов. Это не имеет смысла в контексте версии без прокрутки.

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

person Cheryl Simon    schedule 10.01.2011
comment
Я хочу, чтобы ListView добавлял и удалял элементы по индексу и в основном просто прикреплял к arrayylist. Если вы можете сделать это с помощью LinearLayout, расскажите мне, как это сделать. - person jcuenod; 11.01.2011
comment
Вероятно, вы можете сделать это с помощью TableLayout: developer.android.com/reference/android /widget/TableLayout.html - person Cheryl Simon; 11.01.2011
comment
addView выглядит многообещающим в TableLayout, но есть ли какой-то эквивалент setAdapter? - person jcuenod; 12.01.2011
comment
@ j3frea Нет, вам нужно самостоятельно обрабатывать добавление представлений. По сути, это просто LinearLayout, который позволяет добавлять и удалять определенные строки. - person Cheryl Simon; 12.01.2011