2012-07-02 15 views
22

के साथ काम नहीं कर रहा है मैं एंड्रॉइड पर काम कर रहा हूं। मैं चाहता हूं कि मेरी सूची क्षैतिज रूप से अपनी सामग्री को लपेटें और सभी चौड़ाई को भरने के लिए न देखें। Wrap_content गुण काम नहीं कर रहे हैं। क्या करें?एंड्रॉइड: wrap_content ListView

उत्तर

31

Romain Guy के रूप में (Google इंजीनियर यूआई टूलकिट पर काम करता है) ने अपनी पोस्ट

चौड़ाई को wrap_content पर सेट करके आप सूची दृश्य को अपने बच्चों के सबसे व्यापक के रूप में व्यापक रूप से बता रहे हैं। इसलिए सूची दृश्य को अपने आइटमों को मापना होगा और एडाप्टर पर getView() को कॉल करने के लिए आइटम प्राप्त करना होगा। यह लेआउट पास की संख्या, पैरेंट लेआउट का व्यवहार, आदि

तो यदि आप अपनी सूची दृश्य की लेआउट चौड़ाई या लेआउट ऊंचाई wrap_content पर सेट करते हैं तो सूची दृश्य प्रत्येक दृश्य को मापने का प्रयास करेगा जो उससे जुड़ा हुआ है - जो निश्चित रूप से आप नहीं चाहते हैं।

ध्यान रखें: से बचने के, हर समय listviews या GridViews के लिए wrap_content की स्थापना अधिक जानकारी के लिए देखें इस Google I/O videoListView में सूचीदृश्य

+8

यह सलाह बिल्कुल सार्वभौमिक प्रतीत नहीं होती है।ListView/Adapater संयोजन पहले जेनेरिक लोगों की तुलना में अधिक सामान्य और स्केलेबल है, जिसका अर्थ है कि लोगों को मनमानी डेटासेट के साथ wrap_content का उपयोग करने के परिणामों का एहसास भी नहीं हो सकता है। लेकिन यह कहना नहीं है कि ऐसे कई मामले नहीं हैं जहां डेटासेट एक निश्चित या सीमित आकार का है। उन मामलों में, wrap_content का उपयोग करके एक निर्णय कॉल अधिक होगी। – spaaarky21

+3

ऐसा लगता है कि कुछ लिंट के बारे में चेतावनी दी जानी चाहिए - लेकिन वर्तमान में यह नहीं है। –

+1

मुझे नहीं पता कि यह जवाब क्यों स्वीकार किया गया था: यह सवाल का जवाब नहीं देता है। यह रोमेन के गाय पोस्ट को भी तोड़ देता है - जो कि एक पूरी तरह से अलग सवाल था: एक लेआउट को मापने की संख्या - और एक वीडियो को इंगित करता है जो वास्तव में समझाता है कि wrap_content को कम से कम 3 सूची आइटमों के लिए क्यों काम करना चाहिए, और "प्रकार काम "अधिक जटिल सूचियों के लिए (काफी प्रदर्शन लागत पर)। अब तक – Rick77

3
I want my list view to wrap its content horizontally and not to fill all the width. 

सूची दृश्य के मामले में आप wrap_content नहीं दे सकता, क्योंकि यदि आप सूची दृश्य केवल पहले तीन आइटम (पंक्तियां) दिखाया जाएगा बाकी नजरअंदाज कर दिया जाएगा के लिए wrap_content दे .. तो डॉन ' टी उपयोग wrap_content .. हमेशा fill_parent का उपयोग करें या सूची दृश्य

के लिए match_parent सूची दृश्य पर कुशल डिजाइन के लिए आप देख सकते हैं इस World of ListView

+2

fill_parent प्रयोग न करें। इसे एंड्रॉइड 2.2 में बहिष्कृत किया गया था: http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#FILL_PARENT – spaaarky21

29

की दुनिया के लिए आदेश में के बारे में बात प्राप्त wrap_content ऊंचाई, हम CustomListView उपयोग करने की आवश्यकता कि extends हमारे मूल ListView

MyListView.java

public class MyListView extends ListView { 

    private android.view.ViewGroup.LayoutParams params; 
    private int oldCount = 0; 

    public MyListView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     if (getCount() != oldCount) 
     { 
      int height = getChildAt(0).getHeight() + 1 ; 
      oldCount = getCount(); 
      params = getLayoutParams(); 
      params.height = getCount() * height; 
      setLayoutParams(params); 
     } 

     super.onDraw(canvas); 
    } 

} 
इस तरह से अपनी layout उपयोग कस्टम दृश्य में

,

layout.xml

<com.yourpackagename.MyListView 
     ...  
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     ... /> 
+0

पूरी तरह से काम करता है! – beetree

+1

शानदार! जब मैं एक RecyclerView के अंदर ListView का उपयोग करना चाहता था तो मेरे लिए काम किया। – VSG24

+3

यह उत्तर उपयोगी है, लेकिन जब ListView रीसाइक्लर व्यू के अंदर है, स्क्रॉलिंग अपमानजनक प्रतीत होता है। तो असली समाधान मापन विधि पर ओवरराइड करना है। यह उत्तर देखें: http://stackoverflow.com/a/24186596/1901561 – RIscRIpt

3

यह LinearLayout बनाएं द्वारा लागू किया जा सकता इस उदाहरण की तरह

public class LinearLayoutAdapter { 
LinearLayout linearLayout; 
ArrayList<String> arrayList 
private View rootView; 
private static LayoutInflater inflater; 
public ChoicesAdapter_(ArrayList<String> arrayList ,LinearLayout linearLayout) 
{ 
    this.index =index; 
    this.arrayList=arrayList; 
    this.linearLayout=linearLayout; 
    notifyDataSetChanged(); 
} 
private void notifyDataSetChanged() { 
    linearLayout.removeAllViews(); 
    for (int i =0;i<getCount();i++){ 
     linearLayout.addView(getView(i,null,null)); 
    } 
} 
public int getCount() { 
    return arrayList.size(); 
} 
public Object getItem(int position) { 
    return null; 
} 
public long getItemId(int position) { 
    return 0; 
} 
public View getView(final int position, View convertView, ViewGroup parent) { 
    rootView = inflater.inflate(R.layout.row_list, null); 
    TextView textView = (TextView)rootView.findViewById(R.id.text);  
    textView.setText(arrayList.get(position)); 
    return rootView; 
} 

MainActivity उदाहरण

public class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ArrayList<String> arrayList = new ArrayList<String>(); 
    arrayList.add("Accent"); 
    arrayList.add("Acclaim"); 
    arrayList.add("Accord"); 
    arrayList.add("Achieva"); 
    arrayList.add("Aerio"); 
    arrayList.add("Aerostar"); 
    LinearLayout linearLayout = (LinearLayout)findViewById(R.id.linearLayout); 
    linearLayoutAdapter= LinearLayoutAdapter(arrayList,linearLayout); 
} 

}

एक्सएमएल उदाहरण

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/text" 
android:layout_width="match_parent" 
android:layout_height="50dp" 
android:gravity="center" 
android:textColor="@color/dark_gray" 
android:background="@color/white" 
android:textSize="20dp" 
android:text="" /> 
+0

हां, आप यह कर सकते हैं, लेकिन आप सूची दृश्यों के लिए रीसायकल सिस्टम को ढीला (या लागू करने के लिए बहुत कुछ है)। यह कुछ वस्तुओं के लिए ठीक काम करता है, लेकिन कुछ आइटमों के साथ आप सूचीदृश्य का उपयोग न करने और न ही एडाप्टर का उपयोग करने पर विचार कर सकते हैं। –

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