2011-08-14 14 views
10

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

public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null){ 
      Comment c = comments.get(position); 
      convertView = inflater.inflate(R.layout.list_item, null);    
      (TextView)convertView.findViewById(R.id.story)).setText(c.message); 


     } 
      RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 
      lp.setMargins(0, c.getDepth() * 5, 0, 0);    
      convertView.setLayoutParams(lp); 

     return convertView; 
    } 

हम list_item लेआउट जो अंदर कुछ textViews के साथ एक RelativeLayout है बढ़ा देते हैं। मैं फिर रिलेटिव लयआउट का उपयोग कर मार्जिन सेट करने का प्रयास करता हूं। लयआउट पैराम्स। मुझे इस पर क्लास कास्ट अपवाद मिलता है, लेकिन सामान्य लेआउट पैराम्स प्रकार में मार्जिन सेट करने के लिए कोई विधि नहीं है।

मार्जिन सेट करने के बारे में जाने का सबसे अच्छा तरीका क्या है?

यहाँ त्रुटि

java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams 
at android.widget.ListView.setupChild(ListView.java:1779) 
at android.widget.ListView.makeAndAddView(ListView.java:1748) 
at android.widget.ListView.fillDown(ListView.java:670) 
at android.widget.ListView.fillFromTop(ListView.java:727) 
at android.widget.ListView.layoutChildren(ListView.java:1598) 
at android.widget.AbsListView.onLayout(AbsListView.java:1273) 
at android.view.View.layout(View.java:7192) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
at android.view.View.layout(View.java:7192) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
at android.view.View.layout(View.java:7192) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
at android.view.View.layout(View.java:7192) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1145) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1865) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3835) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
at dalvik.system.NativeStart.main(Native Method) 

उत्तर

6

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

6

है जहाँ आप अपने ClassCast अपवाद है मुझे यकीन है कि नहीं हूँ, यह convertView.setLayoutParams(lp); पर है? यदि हां, तो कृपया अपनी list_item xml फ़ाइल की आपूर्ति करें। चूंकि आपका लेआउट RelativeLayout है, तो आपको RelativeLayout.LayoutParams की आपूर्ति करना होगा, जैसा आपने किया था।

संपादित: एक AbsListView.LayoutParams आपूर्ति की जा के कारण ListView करने के लिए, एक ही LayoutParams अभिभावक के रूप में किया है। हालांकि, इस प्रकार का लेआउट margin सेटर प्रदान नहीं करता है। अन्य स्टैक ओवरफ्लो थ्रेड पर, मैंने देखा कि आपको इस तरह के लेआउट को फुला देना है: inflate(xml_id, listView, false); स्पष्ट रूप से कहा गया है कि ListView और सामग्री के साथ कोई कनेक्शन नहीं है। हालांकि, मैं इसे या तो काम नहीं कर सका।

प्लस, मुझे लगता है कि आप convertView निर्माण में मार्जिन सेट कर रहे हैं। यदि आप ऐसा करते हैं, तो केवल वही आइटम जो पहले बनाए गए हैं, उनका अपना कस्टम मार्जिन होगा। अन्य में पुनर्नवीनीकरण दृश्य मार्जिन होगा। मुझे नहीं लगता कि यह वही है जो आप चाहते हैं।

+0

यह वास्तव में कनवर्टर व्यू लौटने के बाद होता है, हालांकि आप सही हैं कि मुझे पहले मार्जिन सेट करने की आवश्यकता है। मैंने अपनी पोस्ट में त्रुटि जोड़ा। –

+1

मैंने इसका परीक्षण करने के लिए एक सरल ऐप बनाया, लेकिन इसे काम करने के लिए प्रबंधित नहीं किया। मेरा सुझाव है कि आप इसके बजाय व्यू पैडिंग का उपयोग करें, जो मुझे एक ही व्यवहार लगता है। convertView.setPadding (0, c.getDepth() * 5, 0, 0); क्षमा करने के लिए खेद है:/ – Astrorvald

+0

दुर्भाग्य से मैं वास्तव में पूरे दृश्य को स्थानांतरित करना चाहता हूं, और पैडिंग केवल दृश्य के भीतर एक स्थान बनाता है। कोशिश करने के लिए धन्यवाद! –

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