Android: listede vurgulamayı devre dışı bırakma


302

ListView satırına dokunurken oluşan turuncu vurgu devre dışı bırakmak istiyorum. Şimdiye kadar benim xml'de aşağıdakileri denedim:

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"

Daha fazla bilgi: Bir kullanıcı bu listView nesnesindeki ekrana dokunduğunda sıfır fark olmasını istiyorum.

Yanıtlar:


674

Bunu xml'nize ekleyin:

android:listSelector="@android:color/transparent"

Ve sorun için bu işe yarayabilir (emin değilim ve daha iyi çözümler olup olmadığını bilmiyorum):

TextView öğenize bir ColorStateList uygulayabilirsiniz .


2
saydam hala seçimi biraz koyulaştırırsa, belki de tamamen saydam olarak tanımlanmaz. Bunun yerine # 00000000'i deneyin, bu tamamen görünmez.
Ridcully

Benim için mükemmel çözüm. Düzen çevreleyen listelemelerin arka planı için çekilebilir bir şeffaf XML ayarlama denedim ama bu ICS cihazlarda yukarıda belirtilen turuncu çubuk yol.
Markus Rudel

@RoflcoptrException Ben Fragmentliste için kullanın . XML düzeni bir LinearLayoutve birden çok TextViewöğe içerir . Satır vurgulamasını nerede devre dışı bırakmalıyım, lütfen?
JJD

40
Java Kodundan yapabilirsinizlistView.setSelector(android.R.color.transparent);
Sulai

@RoflcoptrException -> "TextView'ınıza bir ColorStateList uygulayabilirsiniz" - liste satırları tıklanabilir değilse bu iyi bir seçenektir. Metin görünümü tıklanabilir tıklanmaz, listenin onClick olayı tetiklenmez.
Sebastian Hojas

189

RoflcoptrException'ın cevabı hile yapmalı, ama bir nedenden dolayı benim için işe yaramadı, Bu yüzden benim için çalışan çözümü gönderiyorum, umarım birine yardımcı olur

<ListView 
android:listSelector="@android:color/transparent" 
android:cacheColorHint="@android:color/transparent"
/>

101

Turuncu vurgu efekti ListView üzerinde bir stildir . Bu makalede , listView stilini geçersiz kılma hakkında iyi bir genel bakış sağlar.

Esasen, mevcut duruma göre farklı stil öğelerini belirten bir seçiciniz vardır.

kısa ve hızlı çözüm için buna bakın https://stackoverflow.com/a/12242564/185022


Bu yöntem her listView nesnesi için farklı bir stile sahip olmamı sağlayacak mı? Ayrıca Sebi'nin cevabında ortaya koyduğum konuyu önlemek mümkün müdür?
John Moffitt

1
Evet, stil niteliklerini geçersiz kılabilirsiniz. İlk bağlantıda açıklandığı gibi style = "@ style / MyStyle" özniteliğini kullanarak her ListView'e özel bir stil atayabilirsiniz.
Cheryl Simon

Üzgünüm ama cevap bu olmamalı. Değiştirilmesi listSelectorgerekir.
Ayman Salah

63

Gönderen ListView: Devre dışı Odak Highlight ,

Eğer ayarlarken ListAdapteraşağıdaki kod kullanımını

ListAdapter adapter = new SimpleCursorAdapter(MyList, Layout, c, 
                new String[] { "Name", "Score" }, to) 
{ 
    public boolean areAllItemsEnabled() 
    { 
        return false; 
    } 
    public boolean isEnabled(int position) 
    { 
        return false; 
    } 
}; 

Bu BaseAdaptersınıfı geçersiz kılar . Ayrıca hücreler arasındaki beyaz kenarlığı da iptal eder.


4
Geçersiz, öğe için seçim davranışını devre dışı bıraktı (OnItemClicked tetiklenmeyecek)
Sandor

6
Bu iyi bir çözümdür çünkü bir listview öğesinin vurgulanıp vurgulanmayacağı, estetik olandan çok davranışsal bir konudur. Bu nedenle, seçilebilir olma özelliğine sahip olmak istemediğiniz liste görünümleri için bunu kullanabilirsiniz. Eğer sonunda bir liste görünümü istiyorum gidiyoruz biliyorum çünkü küresel tarzı gerçekten mantıklı değil olabilir seçilebilir ve beni yanlış görünüyor için davranış için stilleri kullanarak. Anlamsal anlamı olmamalı, sadece estetik olmalı. Seçilebilirliğin özelliği semantik bir şeydir.
Thomas Dignan

Bunun dışında, bu sorunun cevabı değil, isEnabledbir öğeyi devre dışı bırakmak için geçersiz kılma onu devre dışı bırakmanın yolu değil! Belgeler, bunun isEnabledbir öğenin ayırıcı olup olmadığını belirlemesi gerektiğini söylüyor .
Bakhshi

39

Listselector ile birlikte ur XMl'ye de ekleyin ..

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 

2
Çok teşekkürler. Kaydırma sırasında tüm listView vurgulanır (benim durumumda beyaz renk) sorunu çözmek istiyorum (Sadece Android 2.3 önce gerçekleşir). Ve çalışıyor.
Yeung

Çeşitlilik için "# 00000000" ve "@android: renk / şeffaf"?
Androider

@Androider 2011 yılında insanların her iki şekilde de çalıştığını bilmelerine izin veriyordum ... Kesinlikle bugün #
000000'e

32

Liste öğelerini doldurmak için ArrayAdapterveya BaseAdaptertuşlarını kullanıyorsanız . yöntem ve dönüş .OverrideisEnabledfalse

 @Override
  public boolean isEnabled (int position) {
    return false;
  }

13

Sanal ve gerçek cihazlarda birkaç 'google' testinden ve testinden sonra, aşağıdaki kodumun işe yaradığını fark ettim:

ArrayAdapter<String> myList = new ArrayAdapter<String>(this, R.layout.list_item, strText) {
    public boolean isEnabled(int position) 
    { 
            return false; 
    } 
};

areAllItemsEnabled()kısmı atladığımı fark ettim .


bu benim için çalıştı. ancak, devre dışı durumuna sahip satırlar için bir çekilebilir varsa, bunların görüntüsünü de değiştireceği anlamına gelmez mi? tıklamayı devre dışı bırakmak ve çekmeceyi değiştirmek mümkün değil mi?
android geliştirici

1
Bu, ListView'ın bölücüler göstermemesine neden olan bir yan etkiye sahiptir.
Maciej Pigulski

11

Bana hiçbir şey yardımcı olmaz ama bu:

transparent_drawable.xml:

<?xml version="1.0" encoding="utf-8"?>    
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00000000"/>
</shape>

layout.xml:

android:listSelector="@drawable/transparent_drawable"

7

kodda

listView.setSelector(getResources().getDrawable(R.drawable.transparent));

ve çekilebilir klasöre küçük saydam görüntü ekleyin.

Beğen: şeffaf.xml

<?xml version="1.0" encoding="utf-8"?>    
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00000000"/>
</shape>

5

Benim android:focusableInTouchMode="true"için gitmenin yolu bu. android:listSelector="@android:color/transparent" faydası yok. Her satırda birkaç nesne içeren özel bir liste görünümü kullandığımı unutmayın.


5

Yalnızca şunu eklemeniz gerekir: android:cacheColorHint="@android:color/transparent"


5

Alternatif olarak:

listView.setSelector(android.R.color.transparent);

veya

listView.setSelector(new StateListDrawable());

1

Bunu yapmanın hızlı ve kolay yolu var: Yöntemde:

private void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    //TODO
    ((ListView)sender).SelectedItem = null;
}

Umarım yardımcı olur;)


Bu c # değil java
Anthony

Çoğu android programcısının hala java kullandığını düşünüyorum çünkü Android Studio'nun desteklediği şey budur, ancak C # neden kullanılabilir. Sadece bunun C #: D olduğunu açıklığa kavuşturmak istiyorum
Anthony

0

Tek bir liste görünümü öğesinin vurgulamasını devre dışı bırakmak, ancak hücreyi etkin durumda tutmak istiyorsanız, vurgulamayı devre dışı bırakmak için o hücrenin arka plan rengini ayarlayın.

Örneğin, hücre düzeninizde android:background="@color/white"


0

Sadece alabilirsiniz possizden almak onItemClick ve yapılacak:

listView.setItemChecked(pos, false);

bildiğim en iyi yol bu

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.