2012-07-02 28 views

cevap

31

Romain Guy olarak görebilirsiniz fill_parent kullanmak veya Liste View verimli tasarım için Liste Görünümü

için match_parent Eğer alt öğelerinden en geniş kadar geniş olması ListView anlatıyorsun wrap_content genişliği ayarlayarak görevinden

Said (UI araç seti Google Mühendisi işleri). ListView bu nedenle öğelerini ölçmeli ve Bağdaştırıcıda getView() öğesini çağırması gereken öğeleri almalıdır. Bu, düzen geçişlerinin sayısına, ana düzenin davranışına vb. Bağlı olarak birkaç kez olabilir.

ListView öğenizin düzen genişliğini veya düzen yüksekliğini wrap_content olarak ayarlarsanız, ListView her bir görünümü ölçmeye çalışacaktır. ona bağlı - ki kesinlikle ne istediğinizi değil.

Unutmayın: önlemek daha fazla ayrıntı için, her zaman listviews veya gridviews için wrap_content ayarına bakın bu Google I/O videoListView ulaşmak amacıyla liste görünümü

+8

Bu tavsiye tam olarak evrensel görünmüyor.ListView/Adapater kombinasyonu, insanların ilk başta gerçekleştirebileceğinden daha genel ve ölçeklenebilirdir; bu da insanların wrap_content'i keyfi veri kümeleriyle kullanma sonuçlarını fark etmeyeceği anlamına gelir. Ancak bu, veri kümesinin sabit veya sınırlı bir boyutta olduğu pek çok vaka olmadığını söylemez. Bu durumlarda, wrap_content kullanımı daha çok bir yargı çağrısı olur. – spaaarky21

+3

Bu, uyarı vermesi gereken bir şey gibi görünüyor - ama şu anda değil. –

+1

Bu cevabın neden kabul edildiğini bilmiyorum: bu soruya hiç cevap vermiyor. Aynı zamanda Roma'nın Guy görevini de geri çekiyor - ki bu tamamen farklı bir soruydu: bir düzenin ölçülen sayısı - ve wrap_content'in neden en az 3 liste öğesi için çalıştığını açıklayan bir videoya işaret ediyor ve " Daha karmaşık listeler için (önemli bir performans maliyetiyle) çalışın. – Rick77

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

sen 'Liste Görünümünde sadece ilk üç madde (satırlar) gerisi yok sayılacaktır gösterilir için wrap_content verirsen çünkü wrap_content vermek .. Yani yok edemez kullanmamaktasınız wrap_content .. Her zaman bu World of ListView

+2

fill_parent kullanmayın. Android 2.2'de kullanımdan kaldırıldı: http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#FILL_PARENT – spaaarky21

29

dünya hakkında wrap_content yüksekliği konuşurken, biz CustomListView kullanmak gerekir extends bizim yerel ListView.

MyListView.java O oluşturma LinearLayout kullanılarak uygulanabilir

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

Mükemmel çalışıyor! – beetree

+1

Fantastik! Bir RecyclerView içinde bir ListView kullanmak istediğimde benim için çalıştı. – VSG24

+3

Bu yanıt yararlıdır, ancak ListView bir RecyclerView içinde olduğunda, yukarı kaydırmak buggy gibi görünür. Yani gerçek çözüm onMeasure yöntemini geçersiz kılmaktır. Bu cevaba bakınız: http://stackoverflow.com/a/24186596/1901561 – RIscRIpt

3

bu gibi layout kullanımı özel görünümünde
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.xml bu örnekte olduğu gibi

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 örneği

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); 
} 

}

XML örneği

<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

Evet, bunu yapabilirsiniz, ancak liste görünümleri için geri dönüşüm sistemini gevşetirseniz (ya da uygulamak için çok şeyiniz varsa). Birkaç öğe için iyi çalışır, ancak birkaç öğe ile, bir bağdaştırıcıdan liste görünümünü kullanmadığınızı düşünebilirsiniz. –

İlgili konular