OnItemCLickListener सूची में काम नहीं कर रहा है


243

Activity कक्षा का कोड:

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में समारोह Adapterवर्ग:

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

फुलाते समय दो xmls का उपयोग करने में कोई समस्या है?


4
@ हाईई मेरा मुद्दा यह था कि मैं अपने लेआउट सेल में इमेजबटन का उपयोग कर रहा था। "Android: descendantFocusability" जोड़ने के बाद भी मेरा क्लिक श्रोता जवाब नहीं दे रहा था। मैंने जो किया था, मैंने सभी ImaegButtons को ImageViews में बदल दिया। इससे मेरी समस्या हल हो गई।
अजित मेमन

जवाबों:


731

मुझे बस यहाँ से एक समाधान मिला, लेकिन गहरी क्लिक करके।

यदि सूची की किसी भी पंक्ति वस्तु में फ़ोकस करने योग्य या क्लिक करने योग्य दृश्य समाहित है, तो OnItemClickListenerकाम नहीं करेगा।

पंक्ति वस्तु में एक परम जैसा होना चाहिए android:descendantFocusability = "blocksDescendants"

यहां आप एक उदाहरण देख सकते हैं कि आपका सूची आइटम कैसा दिखना चाहिए। आपकी सूची आइटम xml होना चाहिए ... 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>

मेरे लिए काम नहीं। किसी को भी [पर एक नज़र ले जा सकते हैं stackoverflow.com/questions/21692209/...
suitianshi

3
आप इस कार्यक्रम को listView.setDescendantFocusability(int focus);उस स्थान पर भी सेट कर सकते हैं , जहां focusपर एक है ViewGroup.FOCUS_BEFORE_DESCENDANTS, ViewGroup.FOCUS_AFTER_DESCENDANTSयाViewGroup.FOCUS_BLOCK_DESCENDANTS
मैक्स वर्ग

मुझे लगता है कि यह मज़ेदार है कि 20 लोगों ने आपको एक टिप्पणी में धन्यवाद दिया है। मैं इस समस्या में पिछले 8 घंटों से चल रहा हूं, इसके लिए बहुत धन्यवाद।
स्पार्टिकव्स

1
मेरा सवाल यह एक Android बग है या यह डिजाइन द्वारा है?
fangzhzh

मैं अब 6 घंटे के लिए इस पर अटक गया हूं, और मुझे वास्तव में मदद की ज़रूरत है। stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
रुचिर बरोनिया

89

समस्या यह है कि आपके लेआउट में फ़ोकस करने योग्य या क्लिक करने योग्य आइटम हैं। यदि किसी दृश्य में फ़ोकस करने योग्य या क्लिक करने योग्य आइटम होता है, तो OnItemCLickListener नहीं कहा जाएगा।

अधिक जानकारी के लिए यहां क्लिक करें

यदि ऐसा न हो तो कृपया अपना एक लेआउट xmls पोस्ट करें।


2
यह मेरे लिए समाधान था, मैं अपने विचार को क्लिक करने योग्य घोषित कर रहा था। धन्यवाद!
राजाराम

1
धन्यवाद! मैंने अपने 2 EditTextएस को बदल दिया TextView, और मेरे CheckBoxसाथ android:descendantFocusability="blocksDescendants"जोड़े रहने (और टॉगल-सक्षम) रहने की अनुमति दी गई LinearLayout
अज़र्सपॉट

हाँ! मैं android:focusableInTouchMode="true"पंक्ति के लिए था , एक बार हटा दिया तो यह काम करना शुरू कर दिया! :-)
तेज

58

मेरी सूचियों के लिए, मेरी पंक्तियों में अन्य चीजें हैं जिन्हें क्लिक किया जा सकता है, जैसे बटन, इसलिए एक कंबल blocksDescendantsकाम नहीं करता है। इसके बजाय मैंने बटन के xml में एक लाइन जोड़ी:

android:focusable="false"

इससे पंक्तियों पर क्लिकों को अवरुद्ध करने से बटन रहता है, लेकिन फिर भी बटन क्लिकों को लेने देता है।


@ user1840899 यह एक सामान्य प्रतिक्रिया है और जिसे मैंने सीखा है, इसलिए मैंने इसे पारित किया। यह सही जानकारी है, न कि मतदान के योग्य।
जेने पैपस

यह मेरे लिए लिस्टबॉक्स आइटम (बिना ब्लॉकडेसडेंट के) में एक चेकबॉक्स पर काम करता है
thpitsch

यह बटन को ठीक करते हुए बग को ठीक करता है (मेरे लिए टॉगल बटन) क्लिक करने योग्य
मोहसिन अफशिन

जिस तरह से मुझे रेडियोबॉटन्स के साथ एक GridView मिल सकता है, उसमें काम कर रहा था: Android पर उतरना
स्टीफन मैककॉर्मिक

मैं अब 6 घंटे के लिए इस पर अटक गया हूं, और मुझे वास्तव में मदद की ज़रूरत है। stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
रुचिर बरोनिया

34

आपको अपने listview_item.xml में 2 चरण करने की आवश्यकता है

  1. रूट लेआउट को इसके साथ सेट करें: android:descendantFocusability="blocksDescendants"
  2. इस आइटम में कोई भी ध्यान देने योग्य या क्लिक करने योग्य दृश्य सेट करें:
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"

यहाँ एक उदाहरण है: 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आइटम दृश्य पर सेट onItemClickकरने से कॉल नहीं किया जा सकेगा। इसलिए clickable="false"आइटम रूट दृश्य पर ध्यान देने के लिए ध्यान दें , इस मामले में हैLinearLayout
vovahost

Android सेट करना: descendantFocusability = "blockDescendants" मेरी मदद करता है। धन्यवाद!
LLIAJLbHOu

12/21/16, और खोज के घंटों के बाद, यह काम किया, धन्यवाद आदमी!
टान्नर समर्स

यदि आपके पास परिदृश्य के समान लेआउट है, आदि सुनिश्चित करें कि आप इसे वहां भी करते हैं।
इम्मी

19

सूची के कस्टम पंक्ति लेआउट में बटन टैग के नीचे कोड का उपयोग करें

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

ग्रेट मैन वास्तव में उपयोगी था !!
दिव्यांश ने

यहाँ काम किया !! मेरे पास इस दृश्य में कई चेकबॉक्स हैं और मैं android:descendantFocusability="blocksDescendants"क्लिक करने के लिए इन चेकबॉक्स के साथ प्रयास करता हूं
आर्मंडो मार्क्स सोब्रीहो

17

मुझे वही समस्या थी और मैंने देखा कि मैंने गलती से सेट कर दिया था:

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

मेरे CustomListViewAdapter वर्ग पर।

इसे बदलकर:

return true;

मैंने समस्या को ठीक करने में कामयाबी हासिल की है। बस अगर किसी ने वही गलती की है ...


7
मैं भी एक था@Override public void onApplicationStart { ExplodeThisDevice(); }
लियोन पेलेटियर

17

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

रूट लेआउट में ऊपर जोड़ें


2
विवरण जोड़ने से यह एक बेहतर उत्तर हो सकता है और +1।
किलर

इस सूची तत्व में मेरे और मेरे बटन के लिए अभी भी काम किया है।
गुस्ताव एरिकसन

11

मैंने इस उत्तर की मदद से इसे हल किया

1. List_items.xml के रैखिक लेआउट में निम्नलिखित जोड़ें android:descendantFocusability="blocksDescendants"

लिस्ट में 2.LearLayout के 2.Child Views_items.xml

 android:focusable="false" 

आपका लिंक टूट गया है।
जेसन सी

1
@JasonC आपकी जानकारी के लिए धन्यवाद। यहाँ लिंक stackoverflow.com/a/14915758/5740760
RAJESH KUMAR ARUMUGAM

10

यदि आपके पास केवल आपके पंक्ति दृश्य में पाठ, बटन या stg क्लिक करने योग्य या चयन करने योग्य है

android:descendantFocusability="blocksDescendants"

काफी नहीं है। आपको सेट करना होगा

android:textIsSelectable="false"

आपके पाठ और

android:focusable="false"

अपने बटन और अन्य ध्यान देने योग्य वस्तुओं के लिए।


मैंने इसे बहुत कठिनाई से सीखा है। Android: textIsSelectable = "false" इसके लिए देखें :)
diyoda_

10

यहां तक ​​कि मैं एक ही समस्या थी, मैं चेकबॉक्स कर रहा हूँ, निम्नलिखित नकाबपोश आइटम के लिए किया था

चेकबॉक्स में निम्न गुण जोड़े गए,

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

और ItemClickListner ने काम करना शुरू कर दिया।

विस्तृत उदाहरण के लिए आप लिंक के माध्यम से जा सकते हैं,

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

आशा है कि यह चीयर्स में मदद करता है !!


5

मेरे पास एक ही समस्या थी और सभी उल्लिखित समाधानों का बिना किसी लाभ के प्रयास किया। परीक्षण के माध्यम से मैंने पाया कि पाठ को चयन योग्य बनाने से श्रोता को बुलाया जाने से रोका जा रहा था। इसलिए इसे गलत पर स्विच करके, या इसे हटाकर मेरे श्रोता को फिर से बुलाया गया।

android:textIsSelectable="false"

उम्मीद है कि यह मेरी तरह फंस गया था जो किसी की मदद करता है।


4
  1. इसे मुख्य लेआउट में जोड़ें

    android:descendantFocusability="blocksDescendants"
  2. इस कोड को हर बटन, टेक्स्टव्यू, इमेज व्यू आदि पर लिखें, जो ऑनक्लिक हैं

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

आशा है कि यह काम करेगा।


3

दो कमाल के समाधान यह थे, यदि आपकी फैली हुई सूची से एक टुकड़े में फैली हुई है, तो जानें कि mListView.setOnItemClickListenerआपकी गतिविधि को बनाए जाने से पहले नहीं बुलाया जाएगा, यह सुनिश्चित किया जाता है कि गतिविधि कब बनाई गई है

@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 के स्रोत कोड को देखते हुए, मैं इस पार आया

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

एक onItemClickListenerऑब्जेक्ट जुड़ा हुआ है और इसे कॉल करता है onListItemClick() जैसे कि अन्य समान समाधान, जो ठीक उसी तरह से काम करता है ओवरराइड करना है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

मेरे मामले में xml लेआउट गुणों में से कोई भी उपयोगी नहीं था।

मैं सिर्फ इस तरह कोड की एक पंक्ति जोड़ता हूं : ConvertView.setClickable (गलत);

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

इसलिए मूल रूप से यह xml लेआउट में गुण स्थापित करने के समान है, लेकिन यह केवल एक चीज थी जो मेरे मामले में काम करती है।

यह सही समय नहीं है, लेकिन शायद यह किसी को खुश कोडिंग में मदद करेगा


1

मैंने उपरोक्त सभी कोशिश की है और कुछ भी काम नहीं किया है।

मैंने समस्या को इस प्रकार हल किया:

सबसे पहले मैं कस्टम बटन को परिभाषित करता हूं 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 जैसा दिखता है:

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

तब मैं अपने स्वयं के ButtonClickedश्रोता इंटरफ़ेस को परिभाषित करता हूं :

public interface ButtonClickedListener {
    public void ButtonClicked();
}

फिर मैं अपने श्रोता का उपयोग करता हूँ जैसे कि यह सामान्य था 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

मेरे पास एक ही मुद्दा था, मैं पंक्ति लेआउट में अपने ग्रंथों के लिए एक शैली का उपयोग कर रहा था जिसमें "ध्यान देने योग्य" विशेषता थी। इसे हटाने के बाद मैंने काम किया।


1

मेरे मामले में, मुझे अगली पंक्ति को उसमें से निकालना था Layout

android:clickable="true"


0

यदि आप सरल क्लिक और सूची सूची आइटम पर लंबे समय का उपयोग करना चाहते हैं तो इसे लागू करने के लिए बेहतर तरीके से संदर्भ मेनू का उपयोग करना होगा। यदि आप अपनी सूची के लिए कई पंक्ति लेआउट रखते हैं, तो विशेष रूप से setItemLongClickListener का उपयोग करने से बचें।


0

उसी समस्या का सामना किया, घंटों तक कोशिश की। यदि आपने उपरोक्त सभी की तुलना में लिस्टव्यू और लिस्ट आइटम को change_content से match_parent में बदलने की कोशिश की है।


0

उपरोक्त सभी मेरे लिए विफल रहे। हालाँकि, मैं समस्या को हल करने में सक्षम था (मेरे सिर को पीटने के कई घंटों के बाद - Google, यदि आप सुन रहे हैं, तो कृपया संकलक त्रुटियों के रूप में नीचे जो मुझे सामना करना पड़ा, उसे ठीक करने पर विचार करें)

आपको वास्तव में इस बात से सावधान रहना होगा कि आप अपने xml लेआउट में कौन सी Android विशेषताएँ शामिल करते हैं (इस मूल प्रश्न में, इसे list_items.xml कहा जाता है)। मेरे लिए, जो समस्या पैदा कर रहा था, वह यह था कि मैंने एक एडिटटेक्स्ट व्यू से टेक्स्टव्यू में स्विच किया था और बदलाव से क्रॉफ्ट विशेषता छोड़ दी थी (मेरे मामले में, इनपुट टाइप)। कंपाइलर ने इसे नहीं पकड़ा और क्लिक करने की क्षमता विफल हो गई जब मैं ऐप चलाने गया। आपके लेआउट xml नोड्स में मौजूद सभी विशेषताओं को दोबारा जांचें।


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

फिर आपकी गतिविधि में, लिस्ट में संलग्न करने से पहले एडेप्टर.सेटऑन इटेम क्लीक्लिंटर () का उपयोग करें ।

से नकल GitHub मेरे लिए काम किया


0

मेरे लिए काम करने वाली बात यह थी कि मैं नीचे दिए गए कोड को अपनी पंक्ति के लेआउट के अंदर हर सबव्यू में जोड़ दूं। xml फ़ाइल:

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

तो मेरे मामले में:

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

और यह मेरी फ्रैगमेंट उपवर्ग में मेरा सेटऑन इटक्लेक्लिस्टनर कॉल है:

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
            }

        });

मुझे यहाँ से जवाब मिल गया !


-1

मैंने सूची से क्लिक करने योग्य विचारों को हटाकर समस्या को हल किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.