Подтвердить что ты не робот

Android ListView, который не прокручивается?

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

Мое текущее дерево компоновки похоже на

<LinearLayout>
  <ScrollView>
     <RelativeLayout>

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

4b9b3361

Ответ 1

Как объяснили программисты, которые сделали listView в этом видео из GoogleIo, никогда не кладут ListView внутри прокрутки. Если ваш список не должен прокручиваться, используйте ViewGroup, как линейный макет, и добавьте все элементы в эту ViewGroup в цикле вашего кода. Если вы хотите, чтобы целая строка была кликабельной, вы должны использовать другую ViewGroup в качестве корневого node для каждой строки и добавить 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);
   }
}

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

Ответ 2

У меня была такая же проблема. Я просто расширил метод 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

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

    android:orientation="vertical"

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

Ответ 4

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