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.

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.


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"
/>

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


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.


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"/> 

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

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.


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"

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>

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.


5

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


5

Sebagai alternatif:

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

atau

listView.setSelector(new StateListDrawable());

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


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"


0

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

listView.setItemChecked(pos, false);

itulah cara terbaik yang saya tahu

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.