2012-09-01 16 views

उत्तर

19

मुझे इस आखिरी रात को हल करना पड़ा और यह मेरे लिए काम किया। यह एक बच्चे की चौड़ाई को देखता है और मानता है कि सभी कोशिकाओं की एक ही चौड़ाई है, बच्चे की चौड़ाई से ग्रिडव्यू की चौड़ाई को विभाजित करता है। (getColumnWidth() पहले एपीआई में भी अनुपलब्ध है, इसलिए कामकाज)।

private int getNumColumnsCompat() { 
    if (Build.VERSION.SDK_INT >= 11) { 
     return getNumColumnsCompat11(); 

    } else { 
     int columns = 0; 
     int children = getChildCount(); 
     if (children > 0) { 
      int width = getChildAt(0).getMeasuredWidth(); 
      if (width > 0) { 
       columns = getWidth()/width; 
      } 
     } 
     return columns > 0 ? columns : AUTO_FIT; 
    } 
} 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
private int getNumColumnsCompat11() { 
    return getNumColumns(); 
} 

हालांकि इसके साथ कुछ महत्वपूर्ण प्रतिबंध हैं।

  • यह केवल ग्रिड व्यू के बाद ही काम करेगा और केवल तभी जब इसमें वास्तव में कुछ विचार जोड़े जाएंगे।
  • यह किसी भी सेल स्पेसिंग को setHorizontalSpacing() के साथ जोड़ा नहीं जाता है। यदि आप क्षैतिज अंतर का उपयोग करते हैं तो आपको इसके लिए खाते में बदलाव करने की आवश्यकता हो सकती है।
  • मेरे मामले में मेरे पास कोई पैडिंग या अतिरिक्त चौड़ाई नहीं थी। यदि आप करते हैं, तो यह सुनिश्चित करने के लिए कि विभाजन सही उत्तर के साथ समाप्त होता है, आपको इसे ट्विक करने की आवश्यकता होगी।
1

आप एंड्रॉयड एपीआई गाइड से GridView पेज पर एक नज़र डालें, तो आप वहाँ एक विधि onItemClickListener कहा जाता है, जहां एक पैरामीटर स्थिति है देखेंगे। getNumColumns() के साथ शायद आप पंक्तियों की संख्या प्राप्त कर सकते हैं।

+0

धन्यवाद। getNumColumns() API स्तर 8 – Hong

3

इस प्रयास करें:

Math.ceil((double)gridView.getCount()/(double)gridView.getNumColumns()); 
+2

के लिए उपलब्ध नहीं है शायद संभवतः getColumnWidth प्राप्त करने के बजाय NumColumns प्राप्त करना चाहते हैं। – Joey

+0

ओह .. अभी मिश्रित, धन्यवाद –

+0

मदद करने की कोशिश करने के लिए धन्यवाद। दुर्भाग्यवश, getNumColumns() API स्तर 11 या उच्चतर के लिए है। – Hong

4

मैं वी 8 में getNumColumns की कमी हल, इस मामले में जहां स्तंभों की संख्या संसाधन में निर्दिष्ट किया जाता, एक पूर्णांक संसाधन घोषित करने और का उपयोग करके कि GridView संसाधन और कोड में ।

<integer name="num_grid_columns">2</integer> 

<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:scrollbars="vertical" 
    app:columnCount="@integer/num_grid_columns" 
    app:orientation="horizontal" > 

int cols = getResources().getInteger(R.integer.num_grid_columns); 
2

डुप्लिकेट उत्तर जोड़ना क्योंकि मैंने प्रारंभ में duplicate question का उत्तर दिया था।

मैंने इस कार्यान्वयन को मेरे कस्टम ग्रिड व्यू सबक्लास पर जोड़ा, और यह अपेक्षा के अनुसार काम करता था। मैंने ग्रिड व्यू क्लास के घोषित फ़ील्ड की जांच की और कम से कम एपीआई 8 पर उनके पास पहले से ही mNumColumns नामक एक फ़ील्ड है (जो एपीआई 18 पर getNumColumns() द्वारा वापस किया गया है)। उन्होंने शायद फील्ड नाम को किसी और चीज़ में नहीं बदला है और फिर एपीआई 8 और 18 के बीच वापस नहीं बदला है, लेकिन मैंने जांच नहीं की है।

@Override 
public int getNumColumns() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     return super.getNumColumns(); 
    } else { 
     try { 
      Field numColumns = getClass().getSuperclass().getDeclaredField("mNumColumns"); 
      numColumns.setAccessible(true); 
      return numColumns.getInt(this); 
     } catch (Exception e) { 
      return 1; 
     } 
    } 
} 

@ ओवरराइड किसी भी त्रुटि का कारण नहीं बनता क्योंकि यह केवल एक सुरक्षा जांच एनोटिक है।

मुझे यह भी नहीं पता कि अलग-अलग getNumColumnsCompat() विधि (@ कपासबालपॉज़ उत्तर के रूप में) होने के बजाय ऐसा करने की कोई प्रति-सिफारिशें हैं, लेकिन मुझे यह इस तरह सुंदर साफ पाया गया।

+0

धन्यवाद, यह मेरे लिए काम किया है। – tungdx

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