2016-08-25 9 views
5

में नेस्टेड सूचीदृश्य आइटम नियंत्रण पर काम नहीं करती है मेरे पास 2 पॉपअप हैं। पहले पॉपअप पर मेरे पास चुनिंदा वस्तुओं के साथ ListView है। जब मैं पहली सूची से आइटम पर क्लिक करता हूं, तो दूसरा पॉपअप प्रकट होता है, जिसमें ListView भी चुनने के विकल्प होते हैं।ऑनक्लिक घटना एंड्रॉइड

मैं कस्टम View के रूप में पहली सूची दृश्य आइटम को क्रियान्वित किया है और देखने निर्माता के अंदर ही क्लिक की सदस्यता, उस तरह:

class CustomListItem extends RelativeLayout{ 
    public CustomListItem(){ 
     ... 
     //inflating stuff there 
     ((Button)findViewById(R.id.listItemButton)).setOnClickListener(
      //This code not working as expected, but then could fire a lot of times 
      v -> System.out.println("item clicked"); 
     ); 
    } 
} 

जब मैंने पहली बार onClick हैंडलर आग के लिए पहले संवाद खोलने की उम्मीद है और दूसरी पॉपअप से प्रकट होता है। लेकिन जब मैं दूसरा पॉपअप बंद करता हूं और पॉपअप के लिए Dialog.dismiss() पर कॉल करता हूं) पहले पॉपअप पर onClick हैंडलर पहली सूचीदृश्य पर काम करना बंद कर देता है। कुछ अन्य inetersting चीजें हैं:

  1. onTouch अभी भी काम कर (action=ACTION_DOWN और action=ACTION_UP के लिए कहा जाता है) है सूची दृश्य आइटम के लिए श्रोता;
  2. जब मैं सूचीदृश्य onItemClickListener के लिए सेट करता हूं तो इसे हमेशा कहा जाता है (पहली बार पॉपअप खोला गया था और जब हम इसे वापस लौटते हैं);
  3. जब मैं सूची दृश्य में आइटम पर कई बार क्लिक करता हूं कभी-कभी onClick होता है और इसके बाद इसे कई बार कहा जाता है क्योंकि मैंने पर क्लिक किया था।

क्या आपके पास कोई विचार है कि समस्या का कारण क्या हो सकता है?

अद्यतन

लगता एडाप्टर के अंदर getView विधि के साथ एक समस्या है। क्यों यह नहीं है

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    if (view == null) 
    { 
     view = LayoutInflater.from(context).inflate(R.layout.list_view_item, null); 
    } 

    view.setOnClickListener(v -> { 
     v -> System.out.println("item clicked"); 
    }); 

    return view; 
} 

: नीचे सब कुछ काम करता है

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    if (!constructedViewCache.containsKey(position)) { 
     constructedViewCache.put(position, new CustomListItem()); 
    } 

    return constructedViewCache.get(position); 
} 

जब मैं कोड के लिए इस कोड को बदल दिया: मैं इसे अंदर एक कस्टम सूची आइटम नियंत्रण बनाने के लिए (या कैश से इसे पाने के) के लिए कोशिश की है new CustomListItem() के साथ दृश्य बनाने के लिए संभव है? या यदि यह संभव है तो मुझे यह कैसे करना चाहिए?

+0

हूँ मैं सही ढंग से समझ, कि onclick नहीं ठीक से काम किया, लेकिन अगर आप कई बार क्लिक करने, मान लें कि 20-30 यह हो सकता है: वहाँ जो आइटम एक ही लेआउट और गतिविधि के रूप में एडाप्टर की सूची उपयोग कर रहा है कस्टम DialogFragment का कोड है आग और ऑनक्लिक के लिए उस कोड के बाद 20-30 बार निष्पादित किया जाएगा? –

+0

क्या आप अधिक कोड साझा कर सकते हैं? –

+0

@ vovaxo पूरा कोड बहुत जटिल है। कोड का कौन सा हिस्सा आपके लिए उपयोगी हो सकता है? – Natasha

उत्तर

0

अपनी सूची आइटम के पैरेंट लेआउट घोषणा में विशेषता android:descendantFocusability="blocksDescendants" डालने का प्रयास करें जहां listItemButton रखा गया है।

कहाँ विशेषता android:descendantFocusability

को परिभाषित करता है ViewGroup और उसके वंश के बीच संबंधों को जब फोकस लेने के लिए एक दृश्य के लिए देख।

और निरंतर blocksDescendants मतलब यह है कि:

ViewGroup फोकस प्राप्त करने से उसके वंश रोकेंगे।

दूसरा सवाल

यह एक नया CustomListItem साथ दृश्य बनाने के लिए संभव है()। नीचे दिए गए उदाहरण देखें:

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    return new CustomListItem(context); 
} 

संपादित

मैं अपना पूरा कोड नहीं देखा था, ऐसा लगता है कि आप कुछ गलत कर रहे हैं। यहाँ उदाहरण पर एक नज़र डालें काम कर रहा है:

public class CustomAdapter extends BaseAdapter { 
private Context context; 
private HashMap<Integer, CustomListItem> constructedViewCache = new HashMap<>(); 

public CustomAdapter(Context context) { 
    this.context = context; 
} 

@Override 
public int getCount() { 
    return 20; 
} 

@Override 
public Object getItem(int i) { 
    return null; 
} 

@Override 
public long getItemId(int i) { 
    return 0; 
} 

@Override 
public View getView(int position, View view, ViewGroup viewGroup) { 
    if (!constructedViewCache.containsKey(position)) { 
     constructedViewCache.put(position, new CustomListItem(context, position)); 
    } 
    return constructedViewCache.get(position); 
} 
} 

और द्वितीय श्रेणी:

public class CustomListItem extends RelativeLayout { 
private static final String TAG = "CustomListItem"; 

public CustomListItem(Context context, int position) { 
    super(context); 

     View view = LayoutInflater.from(context).inflate(R.layout.item_view, this); 
    Button button = (Button) view.findViewById(R.id.button); 
    button.setOnClickListener(view1 -> { 
     Log.e(TAG, "CustomListItem: " + position); 
     FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager(); 
     new CustomDialog().show(fragmentManager, "tag"); 
    }); 

} 
} 

संपादित 2

मैं CustomListItem नवीनीकृत किया है संवाद प्रदर्शित करने के लिए बटन क्लिक होने।

public class CustomDialog extends DialogFragment { 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.activity_main, container, false); 
    ListView listView = (ListView) view.findViewById(R.id.list); 
    listView.setAdapter(new CustomAdapter(getActivity())); 
    return view; 
} 
} 
+0

'एंड्रॉइड: descendantFocusability' के परिणाम से मेरा जवाब जांचें, लेकिन परिणामस्वरूप कोई नया सुझाव नहीं है, लेकिन 'नया कस्टमलिस्टस्टेम()' सामान्य रूप से काम करता है और क्लिक को "ब्रेक" नहीं करता है। मुझे अभी भी समस्या का कारण समझ में नहीं आ रहा है: क्यों कैशिंग आइटम क्लिक के साथ समस्या का कारण बनते हैं? – Natasha

+0

मैंने आपका कोड चेक किया है। मैं बिल्कुल वही करता हूं। क्या आपने संवाद के साथ कोशिश की है? मेरे पास सूची और बटन वाला पहला संवाद है जो एक और संवाद खोलता है और जब हम दूसरे संवाद से वापस लौटते हैं तो पहले क्लिक पर काम करना बंद कर देते हैं। प्रारंभ में वे पूरी तरह से काम करते हैं (दोनों संवाद पूर्णस्क्रीन - सुनिश्चित नहीं हैं कि यह महत्वपूर्ण है) – Natasha

+0

संवाद के साथ मेरे लिए ठीक काम करता है। –

संबंधित मुद्दे