2010-11-24 29 views
4

好吧,所以我遇到了listView的attribut layout_width問題。ListView的Layout_width

在我的項目中,我的列表視圖背景圖像不適合屏幕寬度。所以我在wrap_content上設置了layout_width,並且我將listView水平居中。

看來這是一個壞主意,因爲在適配器中,GetView方法被調用的次數是顯示的單元格數量的3倍多。如果我在fill_parent上設置layout_width,問題就解決了。我創建了一個顯示問題的簡單項目。

下面是活動的XML:

<?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" 
> 
<ListView 
    android:id="@android:id/list" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
/> 
</RelativeLayout> 

的item_list XML:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:textSize="16sp" > 
</TextView> 

最後活動:

package fr.example.android.listviewbug; 

import android.app.ListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 

public class ExampleListViewBugActivity extends ListActivity{ 
    public static int cpt; 

    public static final String[] COUNTRIES = new String[] { 
     "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
     "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", 
     "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", 
     "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", 
     "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", 
     "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", "British Indian Ocean Territory", 
     "British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi", 
     "Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde", 
     "Cayman Islands", "Central African Republic", "Chad", "Chile"}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     cpt = 0; 
     setListAdapter(new CustomArrayAdapter(this, R.layout.list_item, COUNTRIES)); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d("AdapterTest", "onDestroy()"); 
    } 

    private class CustomArrayAdapter extends ArrayAdapter<String>{ 
     public CustomArrayAdapter(Context context, int textViewResourceId, String[] countries) { 
      super(context, textViewResourceId, countries); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      Log.d("AdapterTest", " cpt:"+ ++cpt); 
      return super.getView(position, convertView, parent); 
     } 
} 
} 

所以我的解決辦法是簡單地設置fill_parent上的layout_width,並修改listview背景的圖像以添加一些適合的透明邊框屏幕尺寸。

但我想知道爲什麼這個問題與WRAP_CONTENT出現在列表視圖,以及它爲什麼不能在doc如果它是一個已知的問題...

回答

19

通過將寬度設置爲「wrap_content」,您告訴ListView的寬度與最寬的子級寬度一樣寬。因此,ListView必須測量它的項目並獲取它必須在適配器上調用getView()的項目。這可能會發生多次,具體取決於佈局傳遞的數量,父佈局的行爲等。

請記住,無法保證在適配器上調用getView()的次數,也不保證以何種順序電話會發生。因此,您必須實現getView()以儘可能高效。底線是,這不是問題,這是在這種情況下的預期行爲。

+2

你是listview romain的父親。 – Prateek 2013-01-05 11:54:18

9

答案很簡單:如果你設置佈局寬度或佈局高度ListViewwrap_content ListView將嘗試測量附加到它的單個視圖 - 這絕對不是您想要的。

一般來說,應始終避免爲ListView或GridViews設置wrap_content

+0

如果ListView只包含2個項目,那麼測量它們的寬度將會非常好,但ListView不會。所以,一個問題不在wrap_content中,而是在ListView中。 – CoolMind 2015-12-04 11:06:11

相關問題