2013-08-30 3 views
9

मेरे पास ListView है जो पूरी स्क्रीन लेता है, लेकिन कभी-कभी इसमें ListView विजेट को पूरी तरह से कवर करने के लिए पर्याप्त आइटम नहीं होते हैं। मैं उस अंतिम आइटम के नीचे उस रिक्त स्थान पर क्लिक का जवाब देने में सक्षम होना चाहता हूं जिसमें वास्तव में कोई आइटम नहीं है (जिसका अर्थ setOnItemClickListener उपयुक्त नहीं है)।सूची सूची के बाहर होने वाली सूची दृश्य पर क्लिक ईवेंट कैसे सुन सकते हैं?

मैंने माता-पिता दृश्य पर setOnClickListener (जो वे ListView स्वयं के लिए अक्षम) की कोशिश की है, लेकिन क्लिक तक पहुंचने लगते हैं। मैंने ListView पर setOnTouchListener भी कोशिश की, लेकिन इससे किसी कारण से कुछ आइटम क्लिक पंजीकृत नहीं हुए। इसे पूरा करने के तरीके पर कोई विचार? प्राप्त करने के लिए

+3

FWIW के लिए अच्छी तरह से काम के साथ आया था, मैं 'setOnClickListener प्राप्त करने के लिए एक मुद्दा दायर()' प्रतिबंध, उठाया के रूप में आप एक बनाने के उत्कृष्ट बिंदु: http://code.google.com/p/android/issues/detail?id=59559 – CommonsWare

उत्तर

0

एक संभावित तरीका यह height="wrap_content" करने के लिए अपने ListView सेट आप तो आप अपनी गतिविधि है जब उपयोगकर्ता को छू लेती है खाली जगह से घटनाओं पाने के लिए ओवरराइड onTouchEvent() हो सकता है करते हैं है।

Layout.xml

<ListView 
    android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:entries="@array/list" /> 

Activity.java

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ListView mList = (ListView)findViewById(R.id.list); 
     mList.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int pos,long id) { 
       Toast.makeText(v.getContext(), ""+pos, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent me){ 
     if(me.getAction() == MotionEvent.ACTION_DOWN){ 
      Toast.makeText(this, "Empty space", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 
     return false; 
    } 
} 

लेकिन यदि आप किसी कारण से आपका ListView ऊंचाई match_parent किया जा रहा है पर भरोसा कर रहे हैं (यानी पृष्ठभूमि drawable) तो यह जीता एक आदर्श समाधान नहीं है।

+0

क्या आपने यह कोशिश की है या क्या आप हाथ से जानते हैं यदि ListView wrap_content के साथ अच्छी तरह से इंटरैक्ट करता है? यह सिर्फ मेरी अंतर्ज्ञान को ऐसी चीज के रूप में मारता है जो अच्छी तरह से संभाला नहीं जाएगा: क्या यह सभी ListView के बच्चों को मापने की कोशिश नहीं करेगा? – Foxichu

+0

मैंने कोशिश की। एमुलेटर पर दौड़ें और ठीक काम करने लगते थे। – FoamyGuy

0

यहाँ उदाहरण है कि कैसे मैंने किया: https://github.com/mmokrzycki/listview-with-clickable-empty-view

+0

मैंने अपनी सूचीदृश्य के साथ यह कोशिश की जिसमें टेक्स्टवॉचर्स के साथ एडिटटेक्स वाले पंक्तियां हैं। मैं रिक्त स्थान पर क्लिक ईवेंट को पकड़ने में सक्षम हूं, लेकिन टाइपिंग करते समय संपादन धीमा हो जाता है – desidigitalnomad

0

प्लेस सूचीदृश्य के लिए एक उपयुक्त ऊंचाई की स्थापना करके सूचीदृश्य नीचे एक खाली LinearLayout। उस रैखिक लेआउट पर ऑनक्लिक() विधि रखें। यह करना चाहिए।

5

समान समस्या में भाग लें जहां खाली स्थान पर क्लिक होने पर मुझे विस्तृत सूची तत्वों को बंद करने की आवश्यकता थी। यहां बताया गया है कि मैंने इसे कैसे हल किया।

public class CustomListView extends ListView { 

    private OnNoItemClickListener mOnNoItemClickListener; 

    public interface OnNoItemClickListener { 
    void onNoItemClicked(); 
    } 

    public CustomListView(Context context) { 
    super(context); 
 } 

    public CustomListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

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

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
    //check whether the touch hit any elements INCLUDING ListView footer 
    if(pointToPosition((int) (ev.getX() * ev.getXPrecision()), 
     (int) (ev.getY() * ev.getYPrecision())) == -1 && ev.getAction() == MotionEvent.ACTION_DOWN) { 
     if(mOnNoItemClickListener != null) { 
     mOnNoItemClickListener.onNoItemClicked(); 
     } 
    } 
    return super.dispatchTouchEvent(ev); 
    } 

    public void setOnNoItemClickListener(OnNoItemClickListener listener) { 
    mOnNoItemClickListener = listener; 
    } 

} 

तो नियमित ListView के बजाय अपने एक्सएमएल फ़ाइल में इस CustomListView का उपयोग करें और अपनी गतिविधि/टुकड़ा अंदर OnNoItemClickListener को लागू करने और mListView.setOnNoItemClickListener (यह) कहते हैं; ऑनऑटमक्लिड() फ़ंक्शन पर कॉलबैक सक्षम करने के लिए क्रिएट पर।

ध्यान दें कि यदि आपकी सूची दृश्य में शीर्षलेख या पाद लेख हैं तो इन्हें सूची तत्वों के रूप में माना जाता है और ऑनऑटमक्लिड() को नहीं कहा जाएगा।

0

अन्य उत्तर में से कुछ का मेल, मैं इस है कि मेरे उपयोग के मामले

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... setup list view and other view state 
    listView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN && 
      listView.pointToPosition((int) (event.getX() * event.getXPrecision()), (int) (event.getY() * event.getYPrecision())) == -1) { 
     collapseExpandedListItem(); 
     return true; 
     } 
     return false; 
    } 
    }); 
} 
संबंधित मुद्दे