OnItemCLickListener liste görünümünde çalışmıyor


243

Activity sınıf kodu:

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

getViewİşlev Adaptersınıfında:

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

Şişirirken iki xmls kullanmayla ilgili bir sorun var mı?


4
@hiei Benim sorunum yerleşim hücreleri görüntü düğmeleri kullanmak oldu. "Android: descendantFocusability" ekledikten sonra bile tıklama dinleyicim yanıt vermiyordu. Yaptığım şey, tüm ImaegButtons ImageViews değiştirildi. Bu benim sorunumu çözdü.
Ajith Memana

Yanıtlar:


731

Buradan yeni bir çözüm buldum, ama derin bir tıklamayla.

Listedeki herhangi bir satır öğesi odaklanabilir veya tıklanabilir görünüm içeriyorsa OnItemClickListenerçalışmaz.

Satır öğesinin benzer bir parametresi olmalıdır android:descendantFocusability = "blocksDescendants".

Burada liste öğenizin nasıl görünmesi gerektiğine ilişkin bir örnek görebilirsiniz. Liste öğeniz xml olmalıdır ... 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>

benim için çalışmıyor. Herkes bir göz atabilir [ stackoverflow.com/questions/21692209/…
suitianshi

3
Bunu, aşağıdakilerden biri ile listView.setDescendantFocusability(int focus);nerede programlı olarak ayarlayabilirsiniz , ya dafocusViewGroup.FOCUS_BEFORE_DESCENDANTSViewGroup.FOCUS_AFTER_DESCENDANTSViewGroup.FOCUS_BLOCK_DESCENDANTS
Max Worg

Sanırım bu 20 kişinin size bir yorumda teşekkür etmesi komik. Son 8 saattir bu problemle karşılaşıyorum, bunun için çok teşekkürler.
sparticvs

1
Sorum şu: bu bir android hatası mı yoksa tasarım gereği mi?
fangzhzh

6 saattir burada kaldım ve gerçekten yardıma ihtiyacım var. stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
Ruchir Baronia

89

Sorun, mizanpajlarınızın odaklanabilir veya tıklanabilir öğeler içermesidir. Bir görünüm odaklanabilir veya tıklanabilir öğe içeriyorsa OnItemCLickListener çağrılmaz.

Daha fazla bilgi için buraya tıklayın .

Durum böyle değilse, lütfen mxmls düzeninizden birini gönderin.


2
Bu benim için bir çözümdü, görüşümü tıklanabilir olarak ilan ediyordum. Teşekkürler!
kingraam

1
Teşekkürler! Benim 2 değiştirildi EditTextiçin s TextViews ve CheckBoxbirlikte kalmak için izin (ve geçiş-güçlü kalır) oldu android:descendantFocusability="blocksDescendants"kalbime giden eklendi LinearLayout.
Azurespot

Evet! android:focusableInTouchMode="true"Satır için vardı , kaldırıldıktan sonra sonunda çalışmaya başladı! :-)
SharpC

58

Listelerim için, satırlarımda düğmeler gibi tıklanabilecek başka şeyler var, bu yüzden battaniye yapmak blocksDescendantsişe yaramaz. Bunun yerine düğmenin xml'sine bir satır ekledim:

android:focusable="false"

Bu, düğmelerin satırlardaki tıklamaları engellemesini önler, ancak düğmelerin tıklamaları almasına izin verir.


@ user1840899 Bu yaygın bir yanıt ve öğrendiğim bir yanıt, bu yüzden geçtim. Bu doğru bilgidir, aşağı oylamaya layık değildir.
Janene Pappas

Bu benim için ListView öğelerinde bir CheckBox üzerinde çalışır (bloklar olmadanAğaçlar)
thpitsch

Bu, düğmeleri (benim için ToggleButton) tıklanabilir tutarken hatayı düzeltir
Mohsen Afshin

RadioButton ile çalışan bir GridView elde etmenin tek yolu RadioButton içeren LinearLayout üzerinde android: descendantFocusability = "blocksDescendants" uygulamak ve RadioButton kendisi android ayarlayarak: clickable = "false" oldu.
Stephen McCormick

6 saattir burada kaldım ve gerçekten yardıma ihtiyacım var. stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
Ruchir Baronia

34

listview_item.xml dosyasında 2 adım yapmanız gerekir

  1. kök düzenini şunlarla ayarlayın: android:descendantFocusability="blocksDescendants"
  2. bu öğede odaklanabilir veya tıklanabilir bir görünüm belirleyin:
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"

İşte bir örnek: 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>

clickable="trueÖğe görünümündeki ayar , onItemClickçağrılmamayı sağlar. Öyleyse clickable="false", öğe kök görünümüne de eklemeye dikkat edin, bu durumdaLinearLayout
vovahost

Android ayarı: descendantFocusability = "blockDescendants" bana yardımcı oluyor. Teşekkürler!
LLIAJLbHOu

21/12/16 ve saatlerce arama yaptıktan sonra BU çalıştı, teşekkürler adamım!
Tanner Summers

Manzara vb. İle aynı düzene sahipseniz, orada da yaptığınızdan emin olun.
Immy

19

listview özel satır düzeninde düğme etiketi içinde aşağıdaki kodu kullanın

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

Büyük adam onun gerçekten yararlı oldu!
divyansh ingle

Bu burada çalıştı !! Bu görünümde birçok onay kutusu var ve denemek android:descendantFocusability="blocksDescendants"ve tıklamak için bu onay kutusunu engellemek
Armando Marques Sobrinho 5:17

17

Aynı sorunu yaşadım ve sadece yanlışlıkla ayarladığımı gördüm:

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

benim CustomListViewAdapter sınıfımda.

Bunu şu şekilde değiştirerek:

return true;

Sorunu çözmeyi başardım. Birisinin aynı hatayı yapması durumunda ...


7
Ben de vardı@Override public void onApplicationStart { ExplodeThisDevice(); }
Léon Pelletier

17

Android kullanın : soyundan

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

Kök düzeninde yukarı ekle


2
Ayrıntı eklemek, bunu daha iyi bir yanıt ve +1 yapabilir.
Katil

Bu benim için çalıştı ve liste öğesindeki düğmem hala istendiği gibi çalıştı.
Gustav Eriksson


10

metin görünümleriniz, düğmeleriniz veya stg tıklanabilir veya yalnızca satır görünümünüzde seçilebilirseniz

android:descendantFocusability="blocksDescendants"

yeterli değil. Ayarlamak zorundasın

android:textIsSelectable="false"

metin görüntülemenize ve

android:focusable="false"

düğmelerine ve diğer odaklanabilir öğelere.


Bunu zor yoldan öğrendim. android: textIsSelectable = "false" Buna dikkat edin :)
diyoda_

10

Ben bile aynı sorunu yaşıyorum, onay kutusu yaşıyorum, itemClickListener çalışma masker için aşağıdakileri yaptı,

Onay kutusuna aşağıdaki özellikler eklendi,

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

ve ItemClickListner çalışmaya başladı.

Ayrıntılı örnek için bağlantıdan geçebilirsiniz,

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

Umarım Şerefe yardımcı olur !!


5

Aynı sorunu yaşadım ve bahsi geçen tüm çözümleri denedim. test yoluyla metni seçilebilir hale getirmenin dinleyicinin çağrılmasını önlediğini gördüm. Yani yanlış olarak değiştirerek veya kaldırarak dinleyicim tekrar çağrıldı.

android:textIsSelectable="false"

Umarım bu benim gibi sıkışmış birine yardım eder.


4
  1. Bunu ana Düzen'e ekle

    android:descendantFocusability="blocksDescendants"
  2. Bu kodu onClick olan her düğmeye, Textview, ImageView vb.

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

Umarım işe yarar.


3

İki harika çözüm buydu, ListFragment'ı bir parçadan genişletiyorsanız mListView.setOnItemClickListener, etkinliğiniz oluşturulmadan önce çağrılmayacağını bilin , bu, etkinlik oluşturulduğunda ayarlanmasını sağladı

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

ListFragment için kaynak koduna bakarken, bununla karşılaştım

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) {
    }
}

Bir onItemClickListenernesne eklenir ve onListItemClick() aynı şekilde çalışan diğer benzer çözüm geçersiz kılmaktır.onListItemClick()

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

3

benim durumumda hiçbir xml düzen özellikleri yardımcı olmadı.

Sadece böyle bir kod tek satır ekleyin: 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;
}

temelde xml düzeninde özellikleri ayarlamakla aynı şeyi yapar ama benim durumumda çalışan tek şeydi.

Mükemmel bir zamanlama değil ama belki birine yardımcı olur Mutlu kodlama


1

Yukarıdaki tüm denedim ve hiçbir şey çalıştı.

Sorunu şu şekilde çözdüm:

İlk olarak, 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 şöyle görünür:

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

Sonra kendi ButtonClickedListener arayüzümü tanımlarım :

public interface ButtonClickedListener {
    public void ButtonClicked();
}

Sonra kendi dinleyicimi normalmiş gibi kullanıyorum OnClickListener:

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

    cancelButton.setClickListener(new ButtonClickedListener() {

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

    });

1

Aynı sorun vardı, satır düzeni "odaklanabilir" özniteliği olan metinlerim için bir stil kullanıyordum. Çıkardıktan sonra işe yaradı.



1

Android: autoText özelliği ayrıca TextView otomatik odaklanabilir hale getirir.


0

Hem basit tıklama hem de liste görünümü öğelerine uzun tıklama kullanmak istiyorsanız, uzun menüler için bağlam menüsünü kullanmak daha iyi bir yöntemdir. Özellikle liste görünümünüz için birden çok satır düzeniniz varsa setItemLongClickListener kullanmaktan kaçının.


0

Aynı sorunla karşı karşıya, saatlerce çalıştı. Yukarıdakilerin tümünü denediyseniz, Liste Görünümü'nün ve liste öğesinin layout_width değerini wrap_content öğesinden match_parent olarak değiştirmeyi deneyin.


0

Yukarıdakilerin hepsi benim için başarısız oldu. Ancak, sorunu çözebildim (kafamı vurduktan birkaç saat sonra - Google, dinliyorsanız, lütfen aşağıda karşılaştığımları derleyici hataları şeklinde düzeltmeyi düşünün)

Burada xml düzeninize hangi android özelliklerini eklediğinize gerçekten dikkat etmelisiniz (bu orijinal soruda list_items.xml denir). Benim için soruna neden olan, ben bir EditText görünümden bir TextView geçti ve değişiklik (artık benim durumumda inputType) artık öznitelik ham vardı. Derleyici onu yakalamadı ve uygulamayı çalıştırmaya gittiğimde tıklanabilirlik başarısız oldu. Düzen xml düğümlerinizdeki tüm özellikleri iki kez kontrol edin.


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

Ardından etkinliğinizde adaptor.setOnItemClickListener () kullanın liste görünümüne eklemeden önce .

Kopyalanan Github onun benim için çalıştı


0

Benim için işe yarayan şey, row.xml dosyamın düzeni içindeki her alt görünüme aşağıdaki kodu eklemekti:

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

Benim durumumda:

<?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>

Ve bu benim Fragment alt sınıfımda setOnItemClickListener çağrım:

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
            }

        });

Cevabı buradan aldım !


-1

Tıklanabilir görünümleri listeden kaldırarak sorunu çözdüm.

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.