2012-11-28 31 views
20

listView से हेडर को निकालने का प्रयास करते समय मुझे कुछ समस्याएं आ रही हैं। पहले तो मुझे addHeaderView() का उपयोग इसे जोड़ने के लिए, लेकिन जब मैं एक और लेआउट को बदलने मैं इसे गायब करने के लिए लेकिन removeHeaderView() काम नहीं करता है ...सूची से शीर्षलेख हटाएं

मैं भी चला गया करने के लिए दृश्यता सेट करने की कोशिश की और यह गायब नहीं होता चाहते हैं ...

मैं क्या कर सकता हूं?

अग्रिम

उत्तर

0

धन्यवाद आप addHeaderView() का उपयोग कर रहे हैं, तो आप उस के बाद अपने हैडर हटा नहीं सकते।

तो, addHeaderView() का उपयोग न करें। इसके बजाय, अपना खुद का एडाप्टर बनाएं जो आपके शीर्षलेख के साथ दृश्यों का मुख्य रोस्टर मिश्रण करता है।

https://github.com/commonsguy/cwac-merge

+0

आप शीर्ष लेख दृश्य को हटाने के लिए यदि आप, शीर्ष लेख इस लिंक को देखने के लिए बात करने के लिए एक चर हो सकता है: http://stackoverflow.com/a/39286390/1817569 – Hamid

48

दृष्टिकोण नीचे उल्लेख प्रयास करें ..

एंड्रॉयड ListView#addHeaderView और ListView#addFooterView: मेरे MergeAdapter अपने विशिष्ट मामले को संभाल नहीं करते हैं, आप कई पंक्ति सूत्रों सम्मिश्रण की अवधारणा को देखने के लिए उपयोग कर सकते हैं विधियां अजीब हैं: आपको सूची दृश्य के एडाप्टर को सेट करने से पहले हेडर और पाद लेख दृश्य जोड़ना होगा ताकि सूची दृश्य शीर्षलेख और पाद लेखों को ध्यान में रख सके - आपको अन्यथा अपवाद मिलता है। यहाँ हम headerView के रूप में एक ProgressBar (स्पिनर) जोड़ें:

// स्पिनर एक ProgressBar है

listView.addHeaderView(spinner); 

हम दिखा सकते हैं और इच्छा पर है कि स्पिनर को छिपाने के लिए सक्षम होने के लिए चाहते हैं, लेकिन दूर करने में यह एकमुश्त है

listView.removeHeaderView(spinner); //dangerous! 

तो चलो इसे छिपाने करते हैं: - खतरनाक है क्योंकि हम कभी नहीं ListView को नष्ट किए बिना फिर से जोड़ने के लिए सक्षम होगा याद है, हम addHeaderView नहीं कर सकता यह एडाप्टर है हम करने के बाद! यह भी मुश्किल है, यह भी मुश्किल है। सिर्फ स्पिनर दृश्य को छिपाने के परिणामस्वरूप एक खाली, लेकिन फिर भी दिखाई देने वाला, हेडर क्षेत्र होता है।

अब स्पिनर छिपाने की कोशिश: अभी भी एक बदसूरत अंतरिक्ष के साथ दिखाई दे हेडर क्षेत्र:

समाधान प्रगति डाल करने के लिए है

spinner.setVisibility(View.GONE); 

परिणाम एक लीनियरआउट में बार जो इसकी सामग्री को लपेटता है, और सामग्री को छुपाता है।इस तरह रैपिंग LinearLayout पतन होगा जब इसकी सामग्री एक headerView तकनीकी रूप से अभी भी मौजूद है कि जिसके परिणामस्वरूप, छिपा हुआ है, लेकिन 0dip उच्च:

spinnerLayout = getLayoutInflater().inflate(R.layout.header_view_spinner, null); 
listView.addHeaderView(spinnerLayout); 

:

<LinearLayout 
     xmlns:a="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
    <!-- simplified --> 
     <ProgressBar 
     android:id="@+id/spinner" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    </LinearLayout> 

फिर, हेडर के रूप में लेआउट सेट और जब हम इसे छिपाने के लिए की जरूरत है, लेआउट की सामग्री छुपाने के लिए, नहीं लेआउट:

spinnerLayout.findViewById(R.id.spinner).setVisibility(View.GONE); 

अब हैडर दृश्य से गायब हो जाता है। शीर्ष पर कोई और बदसूरत जगह नहीं!

+2

+1 शानदार - के लिए मुझे – Dori

+0

महान अच्छा काम करता है कार्य, पूरी प्रक्रिया को समझाने का शानदार तरीका। –

+0

मस्तिष्क के अतिरिक्त किलो के साथ आदमी – Sayka

14

अधिकांश लोग AddHeaderView का उपयोग करना पसंद नहीं करते हैं, हालांकि मुझे कभी-कभी जटिल एडाप्टर संशोधित करने से बचने के लिए, या हेडर उनसे बहुत संबंधित नहीं हैं, तो मुझे कभी-कभी यह बहुत सुविधाजनक लगता है।

इस आसान चाल आप मूल में सक्षम हो जाएगा हटाने/हेडर जोड़ने साथ

:

मैं orientation vertical के साथ एक खाली LinearLayout जोड़ने के लिए, और ऊंचाई wrap_content, केवल हैडर रूप में देखें (mListView जाने लक्ष्य listView हो) :

LinearLayout mCustomHeaders=new LinearLayout(context); 
mCustomHeaders.setOrientation(LinearLayout.VERTICAL); 

mListView.addHeaderView(mCustomHeaders); 
mListView.setAdapter (.......) 

Thenafter, मैं हेडर के रूप में सूची में यादृच्छिक सामान जोड़ सकते हैं, कहीं भी,, तब भी जब सूची भरा है:

mCustomHeaders.add(myHeaderView1); 
mCustomHeaders.add(myHeaderView2); 
mCustomHeaders.add(myHeaderView3); 

तुम भी, सभी हेडर नष्ट कर सकते हैं किसी भी समय:

mCustomHeaders.removeAllViews(); // will erase all headers 

आप अंदाजा हो .... आशा है कि यह मदद करता है!

drawerLogoView = mInflater.inflate(R.layout.navigation_drawer_custom_layout, null); 
    mDrawerList.addHeaderView(drawerLogoView,null,false);     
    LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout)); 
    layOut.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 0)); 

इस तरह, यह अदृश्य हो जाता:

+0

यह बहुत अच्छा काम करता है। –

1

कहाँ drawerLogoView मेरी headerview है, यहाँ मैं क्या कर रहा है

LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout)); 
    layOut.setLayoutParams(newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); 
0

मैं का सामना करना पड़ा: डी इसे वापस दिखाने के लिए, आप इस का उपयोग कर सकते इस समस्या को थोड़ा छिपे हुए परिदृश्य में: सूची दृश्य जो मैं व्यवहार कर रहा था वरीयता फ्रेगमेंट से आया था, और हेडर एक वरीयता श्रेणी का प्रतिनिधित्व करता है। तो, ListView की स्थापना की मेरी स्वतंत्रता गंभीर रूप से सीमित थी। लेकिन दो दृष्टिकोण थे (आंशिक रूप से इस पृष्ठ पर अन्य उत्तरों से प्रेरित)। एक मेरी वरीयता श्रेणी में एक कस्टम लेआउट जोड़ना था (extends android.preference.PreferenceCategory एक वर्ग का उपयोग करके, Custom PreferenceCategory Headings देखें)। लेकिन मैं एक आसान तरीके को मिला: के लिए इस PreferenceCategory में पहली पसंद है, मैं onCreateView() ओवरराइड:

@Override public View onCreateView(ViewGroup parent) { 
    parent.setTop(-parent.getChildAt(0).getTop()); 
    return super.onCreateView(parent); 
} 
3

समस्या यह है कि आप हमेशा एक नई वस्तु पैदा कर रहे है जब आप कार्य करें:

View headerView = someView 

तो नए दृश्य पहले से ही listView हेडर के रूप में जोड़ा दृश्य के रूप में ही नहीं है, यह प्रयास करें:

View headerView = inflater.inflate(R.layout.adapter_datatable_saleitem_header, null, false); 
     headerView.setTag(this.getClass().getSimpleName() + "header"); 
     if (listView.getHeaderViewsCount() > 0) { 
      View oldView = listView.findViewWithTag(this.getClass().getSimpleName() + "header"); 
      if (oldView != null) { 
       listView.removeHeaderView(oldView); 
      } 
     } 
1

आप देख सकते हैं हेडर संख्या> 0 तो हैडर निकालकर उसे दोबारा जोड़ें।
यह मेरे लिए ठीक काम करता है।

View _headerView; 
private void function HandleHeaderView(){ 
     if(listView.getHeaderViewsCount() > 0) 
     { 
      listView.removeHeaderView(_headerView); 
     } 

     /* Add list view header */ 
     _headerView = GetHeaderView(); 
     listView.addHeaderView(_headerView); 
} 


private View GetHeaderView() 
{ 
     View header = getLayoutInflater().inflate(R.layout.header_layout, null); 
     // TODO: ... 

     return header 
} 
संबंधित मुद्दे