OnItemCLickListener tidak berfungsi di listview

243

Activity kode kelas:

conversationList = (ListView)findViewById(android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new  ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        Log.d("test","clicked");
    }
});

The getViewfungsi dalam Adapterkelas:

if (v == null) {                                
    LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if(leftSideMessageNumber.equals(m.getTo())) {
        v = vi.inflate(R.layout.conversation_list_item_format_left, null);
    } else {
        v = vi.inflate(R.layout.conversation_list_item_format_right, null);
    }
}

Apakah ada masalah dengan menggunakan dua xml saat menggembung?

hiei
sumber
4
@hiei Masalah saya adalah saya menggunakan imagebuttons di sel layout saya. Bahkan setelah menambahkan "android: descendantFocusability", pendengar klik saya tidak merespons. Apa yang saya lakukan adalah, saya mengubah semua ImaegButtons ke ImageViews. Itu menyelesaikan masalah saya.
Ajith Memana

Jawaban:

731

Saya baru saja menemukan solusi dari sini, tetapi dengan mengklik dalam.

Jika ada item baris daftar berisi tampilan yang dapat difokus atau diklik maka OnItemClickListenertidak akan berfungsi.

Item baris harus memiliki param seperti android:descendantFocusability = "blocksDescendants".

Di sini Anda dapat melihat contoh tampilan item daftar Anda. Item daftar xml Anda harus ... row_item.xml( your_xml_file.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:baselineAligned="false"
    android:descendantFocusability="blocksDescendants"
    android:gravity="center_vertical" >

    // your other widgets here

</LinearLayout>
Bhavesh Hirpara
sumber
tidak bekerja untukku. Adakah yang bisa melihat [ stackoverflow.com/questions/21692209/…
suitianshi
3
Anda juga dapat mengatur ini secara pemrograman dengan di listView.setDescendantFocusability(int focus);mana focussalah satunya ViewGroup.FOCUS_BEFORE_DESCENDANTS, ViewGroup.FOCUS_AFTER_DESCENDANTSatauViewGroup.FOCUS_BLOCK_DESCENDANTS
Max Worg
Saya pikir ini lucu bahwa seperti 20 orang telah berterima kasih kepada Anda dalam komentar. Saya telah mengalami masalah ini selama 8 jam terakhir, terima kasih banyak untuk ini.
sparticvs
1
Pertanyaan saya adalah apakah ini bug android atau karena desain?
fangzhzh
Saya telah terjebak dalam hal ini selama 6 jam sekarang, dan saya benar-benar membutuhkan bantuan. stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
Ruchir Baronia
89

Masalahnya adalah tata letak Anda berisi item yang dapat difokus atau diklik. Jika tampilan berisi item yang dapat difokus atau diklik, OnItemCLickListener tidak akan dipanggil.

Klik di sini untuk informasi lebih lanjut.

Silakan kirim salah satu xml tata letak Anda jika itu tidak terjadi.

balazsbalazs
sumber
2
Ini adalah solusi untuk saya, saya menyatakan pandangan saya dapat diklik. Terima kasih!
kingraam
1
Terima kasih! Saya mengubah 2 EditTexts ke TextViews, dan CheckBoxdiizinkan untuk tetap (dan tetap dapat beralih) dengan android:descendantFocusability="blocksDescendants"menambahkan ke saya LinearLayout.
Azurespot
Iya! Saya memiliki android:focusableInTouchMode="true"untuk baris, setelah dihapus mulai bekerja pada akhirnya! :-)
SharpC
58

Untuk daftar saya, baris saya memiliki hal-hal lain yang dapat diklik, seperti tombol, jadi melakukan selimut blocksDescendantstidak berfungsi. Sebagai gantinya saya menambahkan baris di tombol xml:

android:focusable="false"

Itu membuat tombol-tombol itu tidak memblokir klik pada baris, tetapi tetap membiarkan tombol mengambil klik.

Janene Pappas
sumber
@ user1840899 Ini adalah respons umum dan yang saya pelajari, jadi saya meneruskannya. Ini adalah informasi yang benar, tidak layak untuk di-voting.
Janene Pappas
Ini berfungsi untuk saya di kotak centang di item ListView (tanpa blokDescendants)
thpitsch
Ini memperbaiki bug sambil menjaga tombol (ToggleButton untuk saya) dapat diklik
Mohsen Afshin
Satu-satunya cara saya bisa mendapatkan GridView dengan RadioButtons di dalamnya berfungsi adalah menerapkan android: descendantFocusability = "blocksDescendants" pada LinearLayout yang berisi RadioButton, dan dengan mengatur android: clickable = "false" di RadioButton itu sendiri.
Stephen McCormick
Saya telah terjebak dalam hal ini selama 6 jam sekarang, dan saya benar-benar membutuhkan bantuan. stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
Ruchir Baronia
34

Anda perlu melakukan 2 langkah di listview_item.xml Anda

  1. atur tata letak root dengan: android:descendantFocusability="blocksDescendants"
  2. atur tampilan yang dapat difokus atau dapat diklik dalam item ini dengan:
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"

Berikut ini contohnya: listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:layout_marginTop="10dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:gravity="center_vertical"
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants">

    <RadioButton
        android:id="@+id/script_name_radio_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:textColor="#000"
        android:padding="5dp"
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"
        />

</LinearLayout>
Eddy
sumber
Pengaturan clickable="truepada tampilan item akan membuat onItemClicktidak dipanggil. Jadi perhatikan juga tambahkan clickable="false"pada tampilan root item, dalam hal ini adalahLinearLayout
vovahost
Pengaturan android: descendantFocusability = "blocksDescendants" membantu saya. Terima kasih!
LLIAJLbHOu
12/21/16, dan setelah berjam-jam mencari, INI bekerja, terima kasih man!
Tanner Summers
Jika Anda memiliki tata letak yang sama dengan lansekap, dll. Pastikan Anda melakukannya di sana juga.
Immy
19

gunakan kode di bawah ini di dalam tag tombol dalam tata letak baris kustom listview

 android:focusable="false"
 android:clickable="false"
Milan Shukla
sumber
Great Man itu benar-benar membantu !!
divyansh ingle
ini bekerja di sini !! Saya memiliki banyak kotak centang dalam tampilan ini dan saya mencoba dengan android:descendantFocusability="blocksDescendants"dan memblokir kotak centang ini untuk klik
Armando Marques Sobrinho
17

Saya memiliki masalah yang sama dan saya baru saja melihat bahwa saya tidak sengaja mengatur:

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

di kelas CustomListViewAdapter saya.

Dengan mengubah ini menjadi:

return true;

Saya sudah berhasil memperbaiki masalah. Untuk berjaga-jaga jika seseorang telah melakukan kesalahan yang sama ...

Woody
sumber
7
Saya juga punya@Override public void onApplicationStart { ExplodeThisDevice(); }
Léon Pelletier
17

Gunakan android: descendantFocusability

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dip"
    android:background="@color/light_green"
    android:descendantFocusability="blocksDescendants" >

Tambahkan di atas dalam tata letak root

Amar Gore
sumber
2
Menambahkan detail mungkin menjadikan ini jawaban yang lebih baik dan +1.
Pembunuh
Ini bekerja untuk saya dan tombol saya di elemen daftar masih berfungsi sebagaimana dimaksud.
Gustav Eriksson
11

Saya menyelesaikannya dengan bantuan jawaban ini

1.Tambahkan berikut ini di Layout Linear dari list_items.xml android:descendantFocusability="blocksDescendants"

2. Tampilan Anak dari LinearLayout di list_items.xml

 android:focusable="false" 
RAJESH KUMAR ARUMUGAM
sumber
Tautan Anda rusak.
Jason C
1
@JasonC Terima Kasih Atas Informasi Anda. Berikut ini adalah tautan stackoverflow.com/a/14915758/5740760
RAJESH KUMAR ARUMUGAM
10

jika Anda memiliki tampilan teks, tombol atau stg dapat diklik atau dipilih hanya dalam tampilan baris Anda

android:descendantFocusability="blocksDescendants"

tidak cukup. Anda harus mengatur

android:textIsSelectable="false"

ke tampilan teks Anda dan

android:focusable="false"

ke tombol Anda dan item yang bisa fokus lainnya.

savepopulation
sumber
Saya belajar ini dengan cara yang sulit. android: textIsSelectable = "false" Awasi ini :)
diyoda_
10

Bahkan saya mengalami masalah yang sama, saya memiliki kotak centang, melakukan hal berikut untuk masker itemClickListener bekerja,

Menambahkan properti berikut ke kotak centang,

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

dan ItemClickListner mulai bekerja.

Sebagai contoh terperinci, Anda dapat menelusuri tautan,

http://knowledge-cess.com/android-itemclicklistner-with-checkbox-or-radiobutton/

Semoga ini bisa membantu Ceria !!

Gokul Kulkarni
sumber
5

Saya memiliki masalah yang sama dan mencoba semua solusi yang disebutkan tidak berhasil. melalui pengujian saya menemukan bahwa membuat teks yang dipilih mencegah pendengar dipanggil. Jadi dengan mengalihkannya ke false, atau menghapusnya, pendengar saya dipanggil lagi.

android:textIsSelectable="false"

Semoga ini bisa membantu seseorang yang terjebak seperti saya.

U2tall
sumber
4
  1. Tambahkan ini di Tata Letak utama

    android:descendantFocusability="blocksDescendants"
  2. Tulis kode ini ke setiap tombol, Textview, ImageView dll yang ada diKlik

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

Semoga ini berhasil.

Wajid khan
sumber
3

Dua solusi yang luar biasa adalah ini, jika ListFragment Anda yang diperluas dari sebuah fragmen, tahu bahwa mListView.setOnItemClickListenertidak akan dipanggil sebelum aktivitas Anda dibuat, ini memastikan itu diatur ketika aktivitas telah dibuat

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
            // Do the onItemClick action

            Log.d("ROWSELECT", "" + rowId);
        }
    });
}

Sambil melihat kode sumber untuk ListFragment, saya menemukan ini

public class ListFragment extends Fragment {
    ...........................................
    ................................................

    final private AdapterView.OnItemClickListener mOnClickListener
                = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            onListItemClick((ListView)parent, v, position, id);
        }
    };

    ................................................................
    ................................................................

    public void onListItemClick(ListView l, View v, int position, long id) {
    }
}

Sebuah onItemClickListenerobjek terpasang dan panggilan onListItemClick() Dengan demikian solusi lain yang sejenis, yang bekerja dengan cara yang sama persis adalah untuk overrideonListItemClick()

@Override
public void onListItemClick(ListView l, View v, int position, long rowId) {
    super.onListItemClick(l, v, position, id);
   // Do the onItemClick action

   Log.d("ROWSELECT", "" + rowId);
} 
Rowland Mtetezi
sumber
3

dalam kasus saya tidak ada properti tata letak xml tidak membantu.

Saya baru saja menambahkan satu baris kode seperti ini: convertView.setClickable (false);

@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null || convertView.getTag() == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.my_layout_id, parent, false);
        viewHolder = new ViewHolder(convertView);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    ...
    convertView.setClickable(false);
    return convertView;
}

jadi pada dasarnya ia melakukan hal yang sama seperti mengatur properti dalam tata letak xml tapi itu hanya hal yang berfungsi dalam kasus saya.

Ini bukan waktu yang tepat tapi mungkin itu akan membantu seseorang Happy coding

Marek Skóra
sumber
1

Saya sudah mencoba semua hal di atas dan TIDAK ADA yang berhasil.

Saya memecahkan masalah sebagai berikut:

Pertama saya mendefinisikan Tombol kustom yang disebut ListButton

public class ListButton extends android.widget.Button
{

private ButtonClickedListener clickListener;

public ListButton(Context context)
{
    this(context, null);
}

public ListButton(Context context, AttributeSet attrs)
{
    this(context, attrs, 0);
}

public ListButton(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
}

public void setClickListener(ButtonClickedListener listener) {
    this.clickListener = listener;
}

@Override
public boolean isInTouchMode() {
    return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    return false;
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    switch (event.getAction()) 
      {
          case MotionEvent.ACTION_DOWN:
              break;
          case MotionEvent.ACTION_UP:

              eventClicked();

              break;
          case MotionEvent.ACTION_CANCEL:
              break;
          case MotionEvent.ACTION_MOVE:
              break;
          default :

      }
    return true;
}

private void eventClicked() {
    if (this.clickListener!=null) {
        this.clickListener.ButtonClicked();
    }
}

}

XML terlihat seperti:

<dk.example.views.ListButton
android:id="@+id/cancel_button"
android:layout_width="125dp"
android:layout_height="80dp"
android:text="Cancel"
android:textSize="20sp" 
android:layout_margin="10dp"
android:padding="2dp"
android:background="#000000"
android:textColor="#ffffff"
android:textStyle="bold"  
/>

Lalu saya mendefinisikan ButtonClickedantarmuka Pendengar saya sendiri :

public interface ButtonClickedListener {
    public void ButtonClicked();
}

Lalu saya menggunakan pendengar saya sendiri seolah-olah itu normal OnClickListener:

final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button);

    cancelButton.setClickListener(new ButtonClickedListener() {

        @Override
        public void ButtonClicked() {
            //Do your own stuff here...
        }

    });
AndreasReiff
sumber
1

Saya memiliki masalah yang sama, saya menggunakan gaya untuk teks saya di tata letak baris yang memiliki atribut "fokus". Ini berhasil setelah saya menghapusnya.

Miguel Rdz
sumber
1

Dalam kasus saya, saya harus menghapus baris berikutnya dari Layout

android:clickable="true"
IgniteCoders
sumber
1

Atribut Android: autoText juga membuat TextView otomatis menjadi fokus.

Yury Finchenko
sumber
0

Jika Anda ingin menggunakan klik sederhana dan klik lama pada item tampilan daftar cara yang lebih baik untuk menerapkan itu akan menggunakan menu konteks untuk klik panjang. Hindari menggunakan setItemLongClickListener terutama jika Anda memiliki beberapa tata letak baris untuk tampilan daftar Anda.

Samuel Robert
sumber
0

Menghadapi masalah yang sama, dicoba berjam-jam. Jika Anda telah mencoba semua hal di atas daripada mencoba mengubah layout_width dari Listview dan daftar item menjadi match_parent dari wrap_content.

pemalu
sumber
0

Semua hal di atas gagal untuk saya. Namun, saya dapat menyelesaikan masalah (setelah beberapa jam membenturkan kepala - Google, jika Anda mendengarkan, pertimbangkan untuk memperbaiki apa yang saya temui di bawah ini dalam bentuk kesalahan kompiler, jika mungkin)

Anda benar-benar harus berhati-hati dengan atribut android apa yang Anda tambahkan ke tata letak xml Anda di sini (dalam pertanyaan asli ini, disebut list_items.xml). Bagi saya, yang menyebabkan masalah adalah bahwa saya telah beralih dari tampilan EditText ke TextView dan memiliki sisa atribut cruft dari perubahan (dalam kasus saya, inputType). Kompiler tidak menangkapnya dan kemampuan klik hanya gagal ketika saya menjalankan aplikasi. Periksa ulang semua atribut yang Anda miliki di tata letak xml node Anda.

Ted_Zactly
sumber
0
private AdapterView.OnItemClickListener onItemClickListener;

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
 .......

final View view = convertView;
convertView.setOnClickListener(new View.OnClickListener() {
    @Override
     public void onClick(View v) {
         if (onItemClickListener != null) {
             onItemClickListener.onItemClick(null, view, position, -1);
         }
      }
 });

return convertView;
}

public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

Kemudian dalam aktivitas Anda, gunakan adapter.setOnItemClickListener () sebelum melampirkannya ke tampilan daftar.

Disalin dari github, itu berhasil untuk saya

Muhammad Waleed
sumber
0

Hal yang berhasil bagi saya adalah menambahkan kode di bawah ini ke setiap subview di dalam tata letak file row.xml saya:

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

Jadi dalam kasus saya:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:id="@+id/testingId"
        android:text="Name"
       //other stuff 
        />

    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:id="@+id/dummyId"
        android:text="icon"
        //other stuff 
        />

    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:id="@+id/assignmentColor"
       //other stuff 
       />

    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:id="@+id/testID"
        //other stuff 
        />

    <TextView
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:text="TextView"
        //other stuff 
        />

</android.support.constraint.ConstraintLayout>

Dan ini adalah panggilan setOnItemClickListener saya di subkelas Fragmen saya:

CustomListView = (PullToRefreshListCustomView) layout.findViewById(getListResourceID());
        CustomListView.setAdapter(customAdapter);
        CustomListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d("Testing", "onitem click working");
              //  other code
            }

        });

Saya mendapat jawabannya dari sini !

spcarlin
sumber
-1

Saya memecahkan masalah dengan menghapus tampilan yang dapat diklik dari daftar.

sidKhalid
sumber