Android: menonaktifkan sorotan pada klik listView

302

Saya ingin menonaktifkan sorotan oranye yang terjadi saat menyentuh baris listView. Sejauh ini di xml saya, saya telah mencoba yang berikut:

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

Informasi lebih lanjut: Saya ingin tidak ada perbedaan ketika pengguna menyentuh layar pada objek listView ini.

John Moffitt
sumber

Jawaban:

674

Tambahkan ini ke xml Anda:

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

Dan untuk masalah ini mungkin berhasil (saya tidak yakin dan saya tidak tahu apakah ada solusi yang lebih baik):

Anda bisa menerapkan ColorStateList ke TextView Anda.

RoflcoptrException
sumber
2
jika transparan masih sedikit menggelapkan pilihan, mungkin itu tidak sepenuhnya transparan. Coba # 00000000 sebagai gantinya, ini sama sekali tidak terlihat.
Ridcully
Solusi sempurna untuk saya. Saya sudah mencoba menetapkan selector XML transparan yang dapat digambar untuk latar belakang tampilan listviews di sekitar tata letak tetapi ini mengarah ke bilah oranye yang disebutkan di atas pada perangkat ICS.
Markus Rudel
@RoflcoptrException Saya menggunakan Fragmentuntuk daftar. Layout XML berisi a LinearLayoutdan beberapa TextViewitem. Di mana saya harus menonaktifkan sorotan baris?
JJD
40
Dari Java Code, Anda bisa melakukannyalistView.setSelector(android.R.color.transparent);
mulai
@RoflcoptrException -> "Anda bisa menerapkan ColorStateList ke TextView Anda" - ini adalah opsi yang baik, jika baris daftar tidak dapat diklik. Segera setelah tampilan teks diklik, acara onClick dari daftar itu sendiri tidak akan menyala.
Sebastian Hojas
189

Jawaban RoflcoptrException harus melakukan trik, tetapi untuk beberapa alasan itu tidak berhasil untuk saya, Jadi saya memposting solusi yang bekerja untuk saya, semoga membantu seseorang

<ListView 
android:listSelector="@android:color/transparent" 
android:cacheColorHint="@android:color/transparent"
/>
Mushtaq Jameel
sumber
101

Efek highlight oranye adalah gaya pada ListView. Artikel ini memberikan gambaran umum yang baik tentang cara mengganti gaya listView.

Pada dasarnya, Anda memiliki pemilih yang menentukan elemen gaya yang berbeda berdasarkan kondisi saat ini.

lihat ini untuk solusi singkat dan cepat https://stackoverflow.com/a/12242564/185022

Cheryl Simon
sumber
Apakah metode ini memungkinkan saya memiliki gaya yang berbeda untuk setiap objek listView? Juga, apakah mungkin untuk menghindari masalah yang saya kemukakan dalam jawaban Sebi?
John Moffitt
1
Ya, Anda dapat mengganti atribut gaya apa pun. Anda dapat secara khusus menetapkan gaya untuk setiap ListView menggunakan atribut style = "@ style / MyStyle" seperti yang dijelaskan dalam tautan pertama.
Cheryl Simon
Saya minta maaf tapi ini seharusnya tidak menjadi jawabannya. Mengubah yang listSelectorseharusnya itu.
Ayman Salah
63

Dari ListView: Nonaktifkan Fokus Sorotan ,

ketika Anda mengatur ListAdapterpenggunaan kode berikut

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

Ini akan menimpa BaseAdapterkelas. Ini juga membatalkan batas putih antar sel.

emdog4
sumber
4
Tidak valid, itu menonaktifkan perilaku seleksi (OnItemClicked tidak akan menyala) untuk item
Sandor
6
Ini adalah solusi yang baik karena apakah item listview yang disorot lebih merupakan masalah perilaku daripada yang estetika. Jadi, Anda dapat menggunakan ini untuk tampilan daftar yang Anda tidak ingin memiliki properti yang dapat dipilih. Gaya global tidak terlalu masuk akal, karena Anda tahu Anda pada akhirnya akan menginginkan tampilan daftar yang dapat dipilih, dan menggunakan gaya untuk perilaku kepada saya tampaknya salah. Mereka seharusnya tidak memiliki makna semantik, hanya estetika. Sifat pilih-pilih adalah hal yang semantik.
Thomas Dignan
Terlepas dari itu, ini bukan jawaban untuk pertanyaan ini, mengesampingkan isEnableduntuk menonaktifkan item bukanlah cara untuk menonaktifkannya! Dokumentasi mengatakan bahwa isEnabledseharusnya menentukan apakah suatu benda merupakan pemisah.
Bakhshi
39

tambahkan ini juga ke XMl Anda bersama dengan listselector..hope itu akan berfungsi

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 
sheetal
sumber
2
Terimakasih banyak. Saya ingin menyelesaikan masalah bahwa seluruh listView adalah hightlighted (warna putih dalam kasus saya) saat menggulir (Hanya terjadi sebelum Android 2.3). Dan itu berhasil.
Yeung
"# 00000000" dan "@android: warna / transparan" untuk jenis variasi?
Androider
@Androider ya pada tahun 2011 saya membiarkan orang tahu itu bekerja dua arah ... Pasti hari ini Anda tidak perlu # 000000
sheetal
32

Jika Anda menggunakan ArrayAdapteratau BaseAdaptermengisi item daftar. Overrideyang isEnabledmetode dan kembali false.

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

Setelah beberapa 'google'ing dan pengujian pada perangkat virtual dan nyata, saya perhatikan kode di bawah saya berfungsi:

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

perhatikan bahwa saya telah menghapus areAllItemsEnabled()bagiannya.

aerobrain
sumber
ini berhasil untuk saya. Namun, bukankah itu berarti bahwa jika ada drawable untuk baris yang memiliki status dinonaktifkan, itu juga akan mengubah gambar mereka? apakah mungkin untuk menonaktifkan klik tetapi tidak mengubah gambar?
pengembang android
1
Ini memiliki efek samping yang menyebabkan ListView tidak menampilkan pembagi.
Maciej Pigulski
11

Tidak ada yang membantu saya selain ini:

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"
Dmitry Chistyakov
sumber
7

dalam kode

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

dan tambahkan gambar transparan kecil ke folder yang dapat digambar.

Seperti: transparent.xml

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

Bagi saya android:focusableInTouchMode="true"adalah cara untuk pergi. android:listSelector="@android:color/transparent" tidak ada gunanya. Perhatikan bahwa saya menggunakan tampilan daftar kustom dengan sejumlah objek di setiap baris.

erdomester
sumber
5

Anda hanya perlu menambahkan: android:cacheColorHint="@android:color/transparent"

Prakash
sumber
5

Sebagai alternatif:

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

atau

listView.setSelector(new StateListDrawable());
Natali
sumber
1

Ada cara cepat dan mudah untuk melakukan ini: Dalam metode:

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

Semoga ini akan membantu;)

FeldonDragon
sumber
Ini c # bukan java
Anthony
Saya pikir sebagian besar programmer Android masih menggunakan java karena itulah yang didukung Android Studio, tetapi C # dapat digunakan. Saya hanya ingin menjelaskan bahwa ini adalah C #: D
Anthony
0

Jika Anda ingin menonaktifkan sorotan untuk item tampilan daftar tunggal, tetapi tetap mengaktifkan sel, atur warna latar belakang untuk sel tersebut untuk menonaktifkan sorotan.

Misalnya, dalam tata letak sel Anda, atur android:background="@color/white"

Lagu
sumber
0

Anda hanya bisa mendapatkan posyang Anda dapatkan dari onItemClick dan lakukan:

listView.setItemChecked(pos, false);

itulah cara terbaik yang saya tahu

Kepala Madog
sumber