2013-06-14 7 views
5

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

activity_main.xml

<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" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:background="#D0D0D0" 
tools:context=".MainActivity" > 

<Button 
    android:id="@+id/addcourse" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:text="Add Course" /> 

<EditText 
    android:id="@+id/coursenameet" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:ems="10" 
    android:layout_marginBottom="2dp" 
    android:layout_marginTop="2dp" 
    android:hint="Course Name" 
    android:inputType="textCapWords" > 

    <requestFocus /> 
</EditText> 

<View 
    android:id="@+id/divider" 
    android:layout_width="match_parent" 
    android:layout_height="3dp" 
    android:layout_below="@+id/coursenameet" 
    android:layout_marginBottom="5dp" 
    android:layout_marginTop="5dp" 
    android:background="@android:color/darker_gray" > 
</View> 

<TextView 
    android:id="@+id/weekdaytv" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/divider" 
    android:layout_marginBottom="3dp" 
    android:layout_marginTop="3dp" 
    android:layout_centerHorizontal="true" 
    android:text="Select weekdays for this Course" > 
</TextView> 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/addcourse" 
    android:layout_below="@+id/weekdaytv" 
    android:divider="#FFFFFF" 
    android:dividerHeight="2px"> 

</ListView> 

</RelativeLayout> 

आइटम CheckedTextViews कि BaseAdapter का उपयोग करके लागू कर रहे हैं। , अपने ListView सेट करने के लिए पूरी जगह आवंटित भरने के लिए मुख्य गतिविधि

lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    adapter = new ItemsAdapter(MainActivity.this, weekdays, 6, lv.getBottom() - lv.getTop()); 
    lv.setAdapter(adapter); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      CheckedTextView ctv = (CheckedTextView) arg1; 
      adapter.toggle(ctv); 
     } 
    }); 
+0

कोई सही समाधान मिला? –

उत्तर

0

से स्निपेट आप XML में ListView विशेषता सेट कर सकते हैं: BaseAdapter वर्ग की विधि देखें

public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    int colorpos = position % colors.length; 
    if(v == null){ 
     LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.listviewitem, null); 
    } 
    CheckedTextView newrow = (CheckedTextView) v.findViewById(R.id.checkedtextview); 
    v.setBackgroundColor(colors[colorpos]); 
    newrow.setTextColor(Color.BLACK); 
    newrow.setText(items[position]); 
    return v; 
} 

संपादित है

android:fillViewport=”true” 

या कोड में:

myListView.setFillViewport(true); 

यदि आप किसी सेल का आकार बदलना चाहते हैं, तो आप सेट करने के लिए ViewParams की गणना कर सकते हैं। उदाहरण के लिए, किसी एकल कक्ष के लिए, आप का उपयोग कर सकते हैं:

int n = /* number of cells */ 3; 
int height = (myListView.getBottom() - myListView.getTop()); 
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, height/n); 
v.setLayoutParams(params); 
+0

यह एक त्रुटि देता है: - तत्व सूची "ListView" से जुड़े "एंड्रॉइड: fillViewport" विशेषता के लिए ओपन कोट की अपेक्षा की जाती है। कृपया मदद करें। – tintin

+0

कृपया मुझे बताएं कि आपके उत्तर की अंतिम पंक्ति में myCell क्या है। मेरे पास मेरे कोड में एक समान मूल्य नहीं है। यह भी बताएं कि क्या यह मुख्य गतिविधि या बेसएडाप्टर क्लास में किया जाना है। – tintin

+0

@tintin, मैं आपके वैरिएबल v। – Phil

11

हाय एक कक्षा बनाएं:

AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, AbsListView.LayoutParams.FILL_PARENT); 
v.setLayoutParams(params); 

के लिए n कोशिकाओं, आप अपने ListView के आकार के आधार ऊर्ध्वाधर आकार की गणना कर सकते हैं इस तरह

public class Utility { 

    public static void setListViewHeightBasedOnChildren(ListView listView) { 
     ListAdapter listAdapter = listView.getAdapter(); 
     if (listAdapter == null) { 
      // pre-condition 
      return; 
     } 

     int totalHeight = 0; 
     int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      View listItem = listAdapter.getView(i, null, listView); 
      listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 

     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
     listView.setLayoutParams(params); 
     listView.requestLayout(); 
    } 


} 

इस विधि को कॉल करें जहां आप सूचीदृश्य में पंक्ति ऊंचाई को गतिशील रूप से बदलना चाहते हैं।

Utility.setListViewHeightBasedOnChildren(YourListView); 

अधिक Reference .. उम्मीद है कि यह आपकी मदद करेगा।

+0

पर आवंटित पूरे क्षेत्र को भरती नहीं हैं मैंने बेसएडाप्टर कक्षा में अपनी पंक्तियों की उपस्थिति घोषित की है। कृपया मुझे बताएं कि यह वास्तव में क्या करने जा रहा है ?? इसके अलावा मैं अपने एडाप्टर का उपयोग कर रहा हूं: - lv.setAdapter (एडाप्टर); क्या मुझे इसके बाद इस विधि को कॉल करना है? मान लें कि मेरे पास अभी पंक्तियों की संख्या तय है और मैं इस समय कोई भी पंक्ति नहीं जोड़ रहा हूं। – tintin

+1

बस उस विधि में अपनी सूचीदृश्य घोषित करें। यह आपको बिल्कुल वही देगा जो आप चाहते हैं। – Nirmal

+0

मुझे वास्तव में खेद है लेकिन मैं आपको समझने में असफल रहा हूं। मैंने अपना प्रश्न संपादित कर लिया है और मुख्य गतिविधि कोड का एक स्निपेट डाला है ताकि आप यह देख सकें कि मैं वास्तव में क्या कर रहा हूं। सुझाव दें कि मुझे विधि कहां कॉल करनी चाहिए। – tintin

0

जो लोग अभी भी

listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 

में त्रुटि मिली लिए, कोड की इन पंक्तियों के बारे में इस तरह।

अगर (ViewGroup instanceof ListItem)

listItem.setLayoutParams (नई LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

 listItem.measure(0, 0); 
संबंधित मुद्दे