2012-12-03 10 views
6

का प्रबंधन कैसे करें मेरे पास ग्रिडव्यू (कैलेंडर बनाने के लिए) के लिए निम्न कोड है।ग्रिड व्यू

<GridView 
    android:id="@+id/calendar" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_above="@+id/rl1" 
    android:layout_below="@+id/ll2" 
    android:columnWidth="250dp" 
    android:numColumns="7" > 
    </GridView> 

Grid_Cell निम्नानुसार है।

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@drawable/calendar_button_selector" > 

<Button 
    android:id="@+id/calendar_day_gridcell" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/calendar_button_selector" 
    android:gravity="center" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:textColor="#000" 
    android:textSize="14.47sp" > 
</Button> 

<TextView 
    android:id="@+id/num_events_per_day" 
    style="@style/calendar_event_style" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" > 
</TextView> 

मैं पंक्तियों और स्तंभों के बीच कोई अंतराल सेट करना चाहते हैं। like this

मौजूदा दृश्य निम्नानुसार है।

Existing image

कृपया मुझे अग्रिम में मदद बाहर ... धन्यवाद।

+0

यहां एक नज़र डालें ("क्लिपChildren", "verticalSpacing", आदि जैसे गुणों को देखें ...): http://stackoverflow.com/questions/7705330/gridview-and-excess-space-padding – kinghomer

+0

@kinghomer काम नहीं कर रहा है ... क्षमा करें –

+0

क्या आप अपनी पंक्ति लेआउट पोस्ट कर सकते हैं? – Luksprog

उत्तर

4

मैं तुम्हें एक टुकड़ा देने की कोशिश करेंगे, लेकिन ईमानदारी से, आपके मामले के लिए ग्रिड व्यू का उपयोग करने का कोई मतलब नहीं है क्योंकि वैसे भी आप सभी स्क्रीन स्क्रीन पर हैं। आप एक छोटे से पाश में कुछ LinearLayout एस बना सकते हैं जो परिणाम प्राप्त करेंगे।

मैं आपको स्क्रीन चौड़ाई के अनुसार रनटाइम पर कॉलमविड्थ सेट करने के लिए सलाह दूंगा।

और आपके एडाप्टर को बाल दृश्यों को फुलाते समय उन्हें सेट करने के लिए स्तंभ चौड़ाई और ऊंचाई से खिलाया जाना चाहिए। और इस मामले में, आपको numColumns से छुटकारा पाने की जरूरत है। याद रखें कि कॉलमविड्थ के साथ numColumns का उपयोग करना कोई समझ नहीं आता है, खासकर जब आप पूरी जगह भरना चाहते हैं। यदि आप numColumns सेट करना चाहते हैं, तो कॉलमविड्थ को हटा दें।

समाधान: enter image description here सबसे पहले, हम हमारे लेआउट बनाने के लिए:

यहाँ परिणाम है। मेरे मामले में, यह MainActivity का लेआउट है और इसे activity_main.xml कहा जाता है। (सूचना वहाँ कोई GridView क्योंकि मैं कोड में है कि बाद में जोड़ देंगे है):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <TextView 
     android:id="@+id/header" 
     android:background="#444" 
     android:gravity="center" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textColor="@android:color/white" 
     android:text="Dynamic Static GridView" /> 

    <TextView 
     android:id="@+id/footer" 
     android:gravity="center" 
     android:background="#444" 
     android:textColor="@android:color/white" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Shush" /> 

</RelativeLayout> 

हमारे GridView तत्व के लेआउट में यहाँ है item_grid.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:background="#fff" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

</RelativeLayout> 

अब चाल MainActivity में है (मेरे पास है आपके लिए समझने के लिए कुछ कोड पर टिप्पणी की गई):

पैकेज com.example।dynamicstaticgridview;

import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.GridView; 
import android.widget.RelativeLayout; 
import android.app.Activity; 
import android.graphics.Color; 

/** 
* @author Sherif elKhatib 
* 
*/ 
public class MainActivity extends Activity { 

    private static String items[]; //these are temporary items :p do not use them 
    static { 
     items = new String[7*7]; 
     for(int i=0;i<7*7;i++) { 
      items[i] = String.valueOf(i); 
     } 
    } 

    int numberOfColumns = 7; //defaulting to 7, you can change it when you know 
    int numberOfRows = 7; //defaulting to 7, you can change it when you know 
    GridView mGrid; 
    ArrayAdapter<String> mAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); 
     params.addRule(RelativeLayout.BELOW, R.id.header); 
     params.addRule(RelativeLayout.ABOVE, R.id.footer); 
     mGrid = new GridView(this) { 
      @Override 
      protected void onLayout(boolean changed, int l, int t, int r, int b) { 
       super.onLayout(changed, l, t, r, b); 
       if(!calculated) 
        getDimens(); 
      } 
     }; 
     mGrid.setVerticalSpacing(0); 
     mGrid.setHorizontalSpacing(0); 
     mGrid.setStretchMode(GridView.NO_STRETCH); 
     mGrid.setBackgroundColor(Color.rgb(100, 10, 10)); 
     ((RelativeLayout)findViewById(R.id.rootview)).addView(mGrid, params); 
    } 

    private int mCellWidth; 
    private int mCellHeight; 
    boolean calculated = false; 
    protected void getDimens() { 
     calculated = true; 
     //here you might have some rounding errors 
     //thats why you see some padding around the GridView 
     mCellWidth = mGrid.getWidth()/numberOfColumns; 
     mCellHeight = mGrid.getHeight()/numberOfRows; 
     mGrid.setColumnWidth(mCellWidth); 
     mGrid.setNumColumns(numberOfColumns); 
     mAdapter = new ArrayAdapter<String>(this, R.layout.item_grid, R.id.text, items) { 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       GridView.LayoutParams params = null; 
       if(convertView == null) { 
        params = new GridView.LayoutParams(mCellWidth, mCellHeight); 
       } 
       convertView = super.getView(position, convertView, parent); 
       if(params != null) { 
        convertView.setLayoutParams(params); 
       } 
       return convertView; 
      } 
     }; 
     mGrid.setAdapter(mAdapter); 
    } 
} 

टिप्पणियाँ: आप वास्तव में बेहतर एक सभ्य एल्गोरिथ्म का चयन करने के mCellWidth, mCellHeight, numberOfColumns, और numberOfRows पाते हैं।

4

मैं गलत हो सकता है लेकिन जहां तक ​​मुझे पता है GridView एक AdapterView है, जो अपने मामले में मतलब है कि आप नहीं गतिशील, एक्सएमएल के माध्यम से, अपने आइटम की ऊंचाई एक तरह से स्वरूपित कर सकते हैं ताकि वे हमेशा भरने पूरे माता-पिता यह ग्रिड विचार (और सूची दृश्य और अन्य एडाप्टर विचार) काम नहीं है।

इस तरह के "स्क्रोल करने योग्य कंटेनर दृश्य" को microfilm readers के रूप में देखा जा सकता है जो बहुत समय पहले "आधुनिक पुस्तकालयों" में मौजूद था। किसी को यह समझने की आवश्यकता है कि वास्तविक दर्शक के साथ डेटा में वास्तव में कुछ भी नहीं है, आप केवल अपने दर्शक (GridView अपने मामले में) का उपयोग करें, जिसमें अंडरलेइंग डेटा आइटम्स पर पैन करने के लिए एक फिक्स और ऊंचाई है, जिसमें उनकी फिक्स चौड़ाई और ऊंचाई भी है ।

जैसा कि मैंने इसे देखा है, आप स्पष्ट रूप से बहुत ही कोने-केस को लक्षित करने का प्रयास कर रहे हैं जहां डेटा को आपके दर्शक विंडो के समान ज्यामितीय आकार होता है।

कुछ टिप्स, हालांकि:

इसके बजाय आप GridLayout पर एक नज़र हो सकता था। GridLayout एपीआई लेवल 14 (आइसक्रीम सैंडविच) में पेश किया गया है, इसलिए आपको वहां अपनी संस्करण समर्थन रणनीति पर पुनर्विचार करना पड़ सकता है (यदि मैं पूरी तरह से गलत नहीं कर रहा हूं तो इसे पुराने प्लेटफ़ॉर्म पर पिछली संगतता के लिए v7 समर्थन पैकेज में भी शामिल किया जाना चाहिए, उसमें यदि आप पुराने एपीआई स्तरों का समर्थन करने के लिए बस अपने ऐप में जार जोड़ सकते हैं)।

फिर भी एक और युक्ति TableLayout का उपयोग इसी तालिका पंक्तियों के साथ और क्या नहीं करेगी। TableLayout पहले दिन से आसपास रहा है, इसलिए वहां कोई पिछड़ा संगतता समस्या नहीं है, लेकिन वे बहुत लेआउट गहन बनने लगते हैं। यदि आप अपने दृश्य को फिर से लोड करने की योजना बना रहे हैं या महीनों के बीच आसानी से स्क्रॉल कर रहे हैं, तो मुझे यकीन नहीं है कि यह आपके लिए समाधान है (गहरे लेआउट मार्गों की मात्रा के कारण)।

एक तिहाई समाधान हो सकता है कि आप अभी भी GridView उपयोग करते हैं, लेकिन आप इसे की ऊंचाई मापने और गतिशील रूप से अपने ग्रिड दृश्य एडाप्टर से अपने फुलाया ग्रिड दृश्य आइटम, मापा GridView ऊंचाई के आधार पर करने के लिए एक ठीक ऊंचाई सेट (अन्य में शब्द: आप सुनिश्चित करते हैं कि आप ऊपर उल्लिखित कोने-केस दर्ज करें)।

यदि आप GridView का उपयोग करते हैं तो आपको लंबवत रिक्ति से छुटकारा पाना होगा। पर android:stretchMode विशेषता है जो आप play around with कर सकते हैं। आप android:verticalSpacing विशेषता पर अलग-अलग (नकारात्मक?) आयामों को भी आजमा सकते हैं।

अपने कस्टम कैलेंडर दृश्य के साथ शुभकामनाएं!

+0

मैंने अभी तक खिंचाव और रिक्ति का उपयोग किया है ... अभी तक काम नहीं कर रहा है । –

+0

क्या आपके पास 'calendar_button_selector' में कोई अंतर्निहित मार्जिन और/या पैडिंग है? – dbm

1

अपने GridView के लिए एक्सएमएल में इन दो मानों सेट करके देखें:

android:horizontalSpacing="0dp" 
android:verticalSpacing="0dp" 

आप शायद android:columnWidth क्षेत्र को दूर करना चाहते हैं।

2

यदि आप अपने ग्रिडव्यू में ऊंचाई और चौड़ाई देना चाहते हैं तो ग्रिडव्यू के बाहर एक रिश्तेदार लेआउट डालें और एंड्रॉइड दें: layout_width और android: layout_height आपके सापेक्ष लेआउट में। फिर अपनी ग्रिडव्यू की चौड़ाई और ऊंचाई को match_parent पर दें। उसके बाद यदि आप पहले अपने ग्रिडव्यू सेल तत्वों को सटीक ऊंचाई और चौड़ाई देना चाहते हैं तो आपको सभी कोशिकाओं की सटीक चौड़ाई और ऊंचाई जाननी होगी और आपको कॉलम के अनुसार कॉलम को परिभाषित करना होगा, उदाहरण के लिए इस कोड के लिए

<GridView 
android:id="@+id/calendar" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_above="@+id/rl1" 
android:layout_below="@+id/ll2" 
android:columnWidth="250dp" 
android:numColumns="7" > 
</GridView> 

यदि आपके पास 1000 डीपी लेआउट नहीं है तो आप एक पंक्ति में 4 पंक्तियों को एक अच्छे दृश्य में कभी नहीं प्राप्त करते हैं, लेकिन केवल ग्रिडव्यू अपनी सेल चौड़ाई निर्धारित करने का प्रयास करेगा।

अपनी स्थिति के लिए अपने कैलेंडर gridview कुछ इस तरह होना चाहिए:

<GridView 
android:id="@+id/calendar" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_above="@+id/rl1" 
android:layout_below="@+id/ll2" 
android:columnWidth="50dp" 
android:numColumns="7" > 
</GridView>