Android'de üst ListView öğesinin üstüne (ve sonun altına) kenar boşluğu ekleyin


147

Bu, Android'de ListView'daki öğelerin düzeni hakkında oldukça ince bir sorudur.

Üstte başlık çubuğu ve ekranın geri kalanını kaplayan ListView olan bir etkinliğim var. ListView'imin solda, sağda ve üstte 10dp dolgusu ile görünmesini istiyorum, ancak ListView'ı yukarı kaydırdığınızda, soluk kenarın altında kaybolmadan önce ilk 10dp dolgusunu örtmesini istiyorum. Benzer şekilde, en alta kaydırdığınızda, son liste öğesi, son liste öğesinin altı ile ekranın gerçek altı arasında 10dp ile görünmelidir (nedenini merak ediyorsanız, bunun nedeni benim istediğim güzel bir arka plan görüntüsü olmasıdır. ListView çevresinde dolaşarak).

ListView'e padding eklemeyi denedim, ancak listeyi kaydırdığınızda, padding kenarının altında kayboluyor.

Ben bir web geliştirme geçmişinden geliyorum ve analoji, ilk liste öğesinin üstüne (ve son liste öğesinin altına) marj eklemek olacaktır.


sadece sol ve sağ kenar boşluğunu belirtin ... xml'nizi buraya yapıştırmayı deneyin, böylece sorun düzenlemesini görebilirim: bekleyin, yani .... Üst ve alt dolgunun da kaydırılmasını mı istiyorsunuz?
Tek Yin

Sol ve sağ kenar boşluğunu belirtemiyorum - Android düzeninde 'kenar boşluğu' yok, sadece dolgu var. Ama evet, üst ve alt dolgunun kaydırılmasını istiyorum - bu onu tanımlamanın iyi bir yolu.
Mick Byrne

Zaten birkaç yöntemi denedim ve yine de başarısız oldum .. Yapacak bazı hilelerim var, ancak yapmak daha zor olacak ... Liste öğesine ilk ve son konuma 2 özel nesne koydunuz .. ve özel bağdaştırıcı kullanarak öğeyi algıla ve farklı bir şekilde çiz (dar yükseklik ve şeffaf)
Tek Yin

Evet ... benim de geri dönmeyi düşündüğüm şey bu. Ancak bununla ilgili her türlü komplikasyon var, çünkü daha sonra liste öğelerinde arka plan rengini ayarlamam gerekecek, görünümde değil, bu da bir şeylere dokunduğunuzda bunu göstermek için bazı efektleri manuel olarak kesmem gerektiği anlamına geliyor. . Yine de yardımınız için teşekkürler ...
Mick Byrne

İyi haber .. Çözümü aldım ... ListActivity'de addHeaderView (View v) kullanabilirsiniz .. sadece arayın getListView(). addHeaderView(capView)ve getListView(). addHeaderView(botView) listenin içeriğini başlatmadan önce çağrıldığından emin olun örn. setListAdapter (adaptör);
Tek Yin

Yanıtlar:


399

Sen yazdın:

ListView'e padding eklemeyi denedim, ancak listeyi kaydırdığınızda, padding kenarının altında kayboluyor.

ListView's clipToPaddingÖzniteliği olarak ayarlayın false. Bu, dolgunun etrafında dolguyu ListView ve düzenin sonuna kadar (ve sadece dolgunun kenarına değil) kaydırmayı mümkün kılacaktır .

Bir örnek:

<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:clipToPaddingViewGroupdüzenler ve görünümler kapsayıcıları için temel sınıf olan XML özniteliğidir .

İlgili yöntem çağrısı :

public void setClipToPadding (boolean clipToPadding)

4
Ek olarak, bu bir stil veya tema haline getirilebilir<item name="android:clipToPadding">false</item>
pjco

2
Oh, bu ScrollView için de geçerli
pjco

4
Tartışmaya biraz geç kaldı, ancak eski cihazlarda (bazı 2.3.x cihazlarda fark ettim) liste öğesi görünümlerinin çok kısa sürede geri dönüştürüldüğüne dikkat edin. Çizim aşaması oraya çizim yapabileceğini bilirken, düzen aşaması bilmiyor, bu nedenle öğenin zaten ekran dışında olduğunu düşünüyor. Bkz stackoverflow.com/questions/15915226/... .
Jeffrey Klardie

@JeffreyKlardie Eski cihazlarda öğelerin çok erken geri dönüştürülmesi sorunuyla karşılaşıyorum ve hatta kaydırma çubuğunun kendisini anında yeniden boyutlandırmasına neden oluyor ki bu gerçekten tuhaf görünüyor. @pjco Neden emin değilim ama clipToPaddingbir stil aracılığıyla ayarlamak benim için işe yaramıyor, sanki uygulanmıyor gibi. Yine de, doğrudan ListView'a ayarlarsam çalışır.
ForceMagic

5
android:scrollbarStyle="outsideOverlay"Kaydırma çubuğunun dolgu
işlemine

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);

Yukarıdaki ListView, 20 piksellik bir üstbilgi ve altbilgi dolgusuna sahip olacaktır.


4
Cevap için teşekkürler! Harika çalışıyor !! Eğer yüksekliği dp olarak ayarlamak istiyorsanız, DisplayMetrics kullanılarak yapılabilir: float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
Tony Ceralva

3
Daha da iyisi, getResources (). GetDimensionPixelOffset (R.dimen.some_value) kullanarak Java düzeyinde dp'de dimens elde edin;
greg7gkb

1
Geliştiriciler sitesinde öğrendiklerime karşı StackOverflow'da ne kadar Android öğrendiğime gerçekten şaşırdım
TrueCoke

1
Daha da iyisi(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Eugen Pechanec

1
API 23'te View için "setHeight ()" yöntemi yoktur. Onun yerine "setMinimumHeight ()" kullanabiliriz.
KWA

10

@ Jakobud'un cevabına ek ...

My listView, android:divider/android:dividerHeightlistView öğeleri arasında şeffaf boşluklar oluşturmak için özellikleri zaten kullanıyordu . Bu, basitçe android:headerDividersEnabledve android:footerDividersEnabledözelliklerini eklememe ve Üstbilgi ve Altbilgi görünümlerini olarak ayarlamama izin verdi new View(Activity.this).

ListView'da zaten bölücüler kurulumunuzun olduğu durumlar için hafif basitleştirme.


1
Mümkün olan her yerde, madde marjları ve dolgular yerine bölücüler kullanmalarını tavsiye ederim. Harika cevap
dzsonni

2

Bir kullanarak Çözümümün ListFragment@Jakobud tarafından ve greg7gkb @ çözümlerine dayalı.

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'ın cevabı iyidir, ancak hücre görünümlerinin tamamen dolgunun arkasındayken erken geri dönüştürülmesi sorunu var, ancak henüz tamamen ekranın dışında değil. ClipToPadding = false ayarı bundan sorumludur ve android'in gelecekteki bir sürümünde düzeltilebilir veya düzeltilmeyebilir. ( ListView'da clipToPadding kullanılırken öğeler zamanından önce geri dönüştürülür )

Yan etkisi olmayan güzel ve basit bir çözümüm var:

  1. Cell_design.xml dosyanıza bir dış (Doğrusal veya Göreceli) Düzen ekleyin
  2. Bu dış Düzende tüm hücre etrafında bir "kenar boşluğu" oluşturmak için dolgu (yani 10dip) ekleyin. (NB yalnızca dolgu işe yarar, dış düzende kenar boşluğu olmaz)
  3. ListView kümesinde android:dividerHeight="-10dip", hücrenin etrafındakinin tersi

Diğer cevapla karşılaştırıldığında, bölücü rengi ayarlamaya gerek yoktur. En üstteki ve en alttaki hücrelerdeki dolgu mevcut olacak ve negatif bölücü, aradaki çift yükseklik ayırıcıları önleyecektir.


"hiçbir yan etkisi olmadan" bu tamamen doğru değil. Görünüm hiyerarşinize, özellikle bir liste görünümü öğesine başka bir katman eklemek, performansları düşürmek anlamına gelir.
Teovald
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.