Android ListView, который не прокручивает? - PullRequest
16 голосов
/ 07 июля 2010

Я пытаюсь сделать макет, похожий на рынок Android ... где, скажем, под комментариями есть то, что выглядит как ListView, но оно не прокручивается (прокрутка всей страницы, но комментарии). Я не уверен, что это даже ListView, но я хочу что-то, что выглядит как представление списка (т.е. есть те разделительные полосы и что нет, но не прокручивается). Есть люди, которые предлагают использовать LinearLayout вместо ListView, но я также хочу, чтобы элементы были кликабельными и открывали новое действие. Пожалуйста, помогите?

Моя текущая раскладка выглядит так

<LinearLayout>
  <ScrollView>
     <RelativeLayout>

Я хочу поместить содержимое в RelativeLayout.

Ответы [ 4 ]

28 голосов
/ 07 июля 2010

Как объяснили программисты, которые делали listView в этом видео от Google, я никогда не помещал ListView внутри View с прокруткой. Если ваш список не должен прокручиваться, используйте ViewGroup как линейный макет и добавьте все элементы в эту ViewGroup в цикле в вашем коде. Если вы хотите, чтобы вся строка была кликабельной, вы должны использовать другую ViewGroup в качестве корневого узла для каждой строки и добавить OnClickListener в это представление.

Пример кода:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

for (int current = 0; current < itemCount; current++) {
   View view = inflater.inflate(R.layout.layout_id, parent, false);

   //initialize the view

   view.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
          Intent intent = new Intent(getApplicationContext(), CLASS_TO_START)
          startActivity(intent);
      }
   });
   viewGroup.addView(view);
   if (current < itemCount - 1) {
      inflater.inflate(R.layout.line, viewGroup);
   }
}

Этот код сгенерирует один View для каждого имеющегося у вас элемента и поместит его в viewGroup. После каждого элемента, кроме последнего, он также добавляет разделитель в viewGroup.

14 голосов
/ 13 апреля 2011

У меня была такая же проблема.Я просто расширил значение по умолчанию LinearLayout с помощью метода setAdapter:

public class LinearListView extends LinearLayout
{
    Adapter adapter;
    Observer observer = new Observer(this);

    public LinearListView(Context context)
    {
        super(context);
    }

    public LinearListView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public LinearListView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public void setAdapter(Adapter adapter)
    {
        if (this.adapter != null)
            this.adapter.unregisterDataSetObserver(observer);

        this.adapter = adapter;
        adapter.registerDataSetObserver(observer);
        observer.onChanged();
    }

    private class Observer extends DataSetObserver
    {
        LinearListView context;

        public Observer(LinearListView context)
        {
            this.context = context;
        }

        @Override
        public void onChanged()
        {
            List<View> oldViews = new ArrayList<View>(context.getChildCount());

            for (int i = 0; i < context.getChildCount(); i++)
                oldViews.add(context.getChildAt(i));

            Iterator<View> iter = oldViews.iterator();

            context.removeAllViews();

            for (int i = 0; i < context.adapter.getCount(); i++)
            {
                View convertView = iter.hasNext() ? iter.next() : null;
                context.addView(context.adapter.getView(i, convertView, context));
            }
            super.onChanged();
        }

        @Override
        public void onInvalidated()
        {
            context.removeAllViews();
            super.onInvalidated();
        }
    }
}

Надеюсь, это поможет!

3 голосов
/ 26 марта 2014

У меня недостаточно очков репутации, чтобы комментировать, но для тех, у кого в решении Nappy есть только 1 элемент, убедитесь, что в файле макета указано следующее:

    android:orientation="vertical"

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

0 голосов
/ 07 июля 2010

Вы можете сделать один ListView и поместить все в него, чтобы вся страница прокручивалась. Вы можете развернуть собственную реализацию адаптера, но я рекомендую использовать превосходную MergeAdapter от CommonsWare Вы можете добавить метки или разделители с помощью addView(), а списки - с помощью addAdapter(). Посетите страницу для получения дополнительной информации об использовании и демонстрационном проекте.

...