Додайте надбавку вище верхнього елемента ListView (і нижче останнього) в Android


147

Це досить тонке запитання щодо компонування елементів у ListView в Android.

У мене є діяльність із заголовком у верхній частині та ListView, що займає решту екрана. Я хочу, щоб мій ListView відображався з 10dp прокладками зліва, справа і вгорі, але коли ви прокручуєте ListView вгору, я хочу, щоб він покривав верхню підкладку 10dp, перш ніж зникнути під зів’ялим краєм. Аналогічно, коли ви прокручуєте донизу, останній елемент списку повинен з’являтися з 10dp між нижньою частиною останнього елемента списку та фактичною нижньою частиною екрана (якщо вам цікаво чому, це тому, що я маю гарне фонове зображення, яке я хочу тикає навколо ListView).

Я спробував додати прокладку до самого ListView, але потім, коли ви прокручуєте список, він зникає під краєм.

Я з фону веб-розробників, і аналогією було б додати маржу над першим елементом списку (і під останнім елементом списку).


вкажіть лише лівий і правий край ... спробуйте вставити свій xml сюди, щоб я міг побачити проблему редагування: зачекайте, ви маєте на увазі .... Ви хочете, щоб верхній і нижній прокладки також прокручувались?
Тек Інь

Я не можу вказати лівий і правий край - у версії Android немає "поля", лише підкладка. Але так, я хочу, щоб верхній і нижній накладки прокручувалися - це хороший спосіб описати це.
Мік Бірн

Я вже спробував декілька методів, і досі не вдався .. У мене є деякі хитрощі, але це буде складніше зробити, хоча ... ви помістите 2 користувацьких об'єкта в елемент списку на першому і останньому місці .. і використовуйте спеціальний адаптер для виявіть предмет та намалюйте його по-різному (вузький зріст та прозорий)
Тек Інь

Так ... це те, що я думав відкинутись також. Але в цьому є всілякі ускладнення, тому що мені потім потрібно буде встановити колір тла в елементах списку, а не перегляд, а значить, мені потрібно буде вручну зламати деякий ефект, щоб показати, коли ви натискаєте речі . Дякуємо за вашу допомогу в будь-якому випадку ...
Mick Byrne

Хороші новини .. Я отримав рішення ... Ви можете використовувати addHeaderView (View v) на ListActivity .. просто зателефонуйте getListView(). addHeaderView(capView)та getListView(). addHeaderView(botView) переконайтесь, що він викликав, перш ніж ініціалізувати вміст списку, наприклад. setListAdapter (адаптер);
Тек Інь

Відповіді:


397

Ти написав:

Я спробував додати прокладку до самого ListView, але потім, коли ви прокручуєте список, він зникає під краєм.

Встановити ListView's clipToPaddingатрибут на false. Це дасть можливість прокладки навколо ListView та прокручування до кінця макета (і не тільки до краю оббивки).

Приклад:

<ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:divider="@android:color/transparent"
    android:dividerHeight="10.0sp"
    android:padding="16dip"
    android:clipToPadding="false"/>

android:clipToPaddingє атрибутом XML ViewGroupбазового класу для макетів та контейнерів переглядів.

Відповідний виклик методу є:

public void setClipToPadding (boolean clipToPadding)

4
Крім того, це може бути перетворено на стиль або тему через<item name="android:clipToPadding">false</item>
pjco

2
О, це стосується і ScrollView
pjco

4
Трохи пізно до обговорення, але зауважте, що на старих пристроях (я помітив це на деяких пристроях 2.3.x) перегляди елементів списку занадто скоро переробляються. Хоча фаза малювання знає, що вона може малювати там, фаза макета цього не робить, тому він вважає, що елемент вже вимкнений з екрана. Дивіться stackoverflow.com/questions/15915226/… .
Джеффрі Клардді

@JeffreyKlardie У мене виникає проблема, коли предмети занадто рано переробляються на старих пристроях, і навіть змушує смугу прокрутки змінювати розміри на ходу, що виглядає справді дивно. @pjco Я не впевнений, чому налаштування clipToPaddingчерез стиль не працює для мене, це як якщо б не застосувати. Хоча, якщо я встановлю його безпосередньо на ListView, він працює.
ForceMagic

5
Не забувайте, android:scrollbarStyle="outsideOverlay"щоб смуга прокрутки пройшла весь шлях і через прокладки
jfcartier

19
View padding = new View(this);
padding.setHeight(20); // Can only specify in pixels unfortunately. No DIP :-(

ListView myListView = (ListView) findViewById(R.id.my_list_view);

myListView.addHeaderView(padding);
myListView.addFooterView(padding);

myListView.setAdapter(myAdapter);

У наведеному вище ListView буде заголовок і колонтитул у 20 пікселів.


4
Дякую за відповідь! Чудово працює !! Якщо ви хочете поставити висоту в dp, це можна зробити за допомогою DisplayMetrics: float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
Tony Ceralva

3
Або ще краще, отримати розміри у dp на рівні Java, використовуючи getResources (). GetDimensionPixelOffset (R.dimen.some_value);
greg7gkb

1
По-справжньому вражений тим, скільки речей з Android я дізнаюся на StackOverflow проти тих, про які я дізнаюся на сайті розробників
TrueCoke

1
Або ще краще(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Євген Печанець

1
Не існує методу "setHeight ()" для View в API 23. Натомість ми можемо використовувати "setMinimumHeight ()".
КВА

10

Додаток до відповіді @ Jakobud ...

Мій listView вже використовував android:divider/android:dividerHeightвластивості для створення прозорих прогалин між елементами listView. Це дозволило мені просто додати android:headerDividersEnabledіandroid:footerDividersEnabled властивості і встановити точку заголовка і нижнього колонтитула new View(Activity.this).

Трохи спрощення для випадків, коли у спискуView вже встановлені роздільники.


1
Я б порадив будь-кому, де це можливо, використовувати роздільники замість поля та пунктів. Чудова відповідь
dzsonni

2

Моє рішення з використанням ListFragment, заснованого на рішеннях @Jakobud та @ greg7gkb.

ListView listView = getListView();
listView.setDivider(null);
listView.setDividerHeight(getResources().getDimensionPixelSize(R.dimen.divider_height));
listView.setHeaderDividersEnabled(true);
listView.setFooterDividersEnabled(true);
View padding = new View(getActivity());
listView.addHeaderView(padding);
listView.addFooterView(padding);

1

@Gunnar Karlsson відповідь хороша, але проблема з тим, що перегляди клітинок передчасно переробляються, коли повністю позаду прокладки, але ще не повністю поза екраном. Налаштування clipToPadding = false несе відповідальність за це, а може і не може бути виправлено у майбутній версії Android. ( При використанні clipToPadding у ListView елементи підлягають переробці передчасно )

У мене прекрасне просте рішення без побічних ефектів:

  1. Додайте зовнішній (лінійний або відносний) макет до свого Cell_design.xml
  2. На цьому зовнішньому макеті додайте прокладку (тобто 10dip), щоб створити "запас" навколо всієї комірки. (Зверніть увагу лише накладки, а не зовнішнє розташування)
  3. У наборі ListView android:dividerHeight="-10dip"протилежне тому, що знаходиться навколо комірки

Порівняно з іншою відповіддю, не потрібно встановлювати колір дільника. Накладка в верхній і нижній осередках буде присутній, і негативний подільник запобіжить подвійні дільники по висоті між ними.


"без побічних ефектів", це не зовсім вірно. Додавання іншого шару в ієрархію перегляду, особливо в елементі перегляду, означає приниження продуктивності.
Теовальд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.