Android 布局\u列表视图的宽度

Android 布局\u列表视图的宽度,android,listview,Android,Listview,好的,所以我遇到了listView的属性布局宽度的问题 在我的项目中,我的listview有一个与屏幕宽度不匹配的背景图像。因此,我在包裹内容上设置了布局宽度,并将listView水平居中 这似乎不是一个好主意,因为在适配器中调用GetView方法的次数是显示的单元格数的3倍多。如果我在填充父对象上设置布局宽度,问题就解决了。我创建了一个显示问题的简单项目 以下是活动的xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLa

好的,所以我遇到了listView的属性布局宽度的问题

在我的项目中,我的listview有一个与屏幕宽度不匹配的背景图像。因此,我在包裹内容上设置了布局宽度,并将listView水平居中

这似乎不是一个好主意,因为在适配器中调用GetView方法的次数是显示的单元格数的3倍多。如果我在填充父对象上设置布局宽度,问题就解决了。我创建了一个显示问题的简单项目

以下是活动的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>
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);
        }
}
}

项目列表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>

最后是活动:

<?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>
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);
        }
}
}
package fr.example.android.listviewbug;
导入android.app.ListActivity;
导入android.content.Context;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
公共类ExampleListViewBugActivity扩展了ListActivity{
公共静态int cpt;
公共静态最终字符串[]国家/地区=新字符串[]{
“阿富汗”、“阿尔巴尼亚”、“阿尔及利亚”、“美属萨摩亚”、“安道尔”,
“安哥拉”、“安圭拉”、“南极洲”、“安提瓜和巴布达”、“阿根廷”,
“亚美尼亚”、“阿鲁巴”、“澳大利亚”、“奥地利”、“阿塞拜疆”,
“巴林”、“孟加拉国”、“巴巴多斯”、“白俄罗斯”、“比利时”,
“伯利兹”、“贝宁”、“百慕大”、“不丹”、“玻利维亚”,
“波斯尼亚和黑塞哥维那”、“博茨瓦纳”、“布韦岛”、“巴西”、“英属印度洋领土”,
“英属维尔京群岛”、“文莱”、“保加利亚”、“布基纳法索”、“布隆迪”,
“科特迪瓦”、“柬埔寨”、“喀麦隆”、“加拿大”、“佛得角”,
“开曼群岛”、“中非共和国”、“乍得”、“智利”};
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
cpt=0;
setListAdapter(新的CustomArrayAdapter(此,R.layout.list_项,国家/地区));
}
@凌驾
公共空间{
super.ondestory();
Log.d(“AdapterTest”、“onDestroy()”);
}
私有类CustomArrayAdapter扩展了ArrayAdapter{
公共CustomArrayAdapter(上下文上下文,int textViewResourceId,字符串[]国家){
超级(上下文、textViewResourceId、国家);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
Log.d(“适配器测试”、“cpt:+++cpt”);
返回super.getView(position、convertView、parent);
}
}
}
因此,我的解决方案是简单地设置填充父对象的布局宽度,然后修改listview背景的图像,添加一些透明边框以适应屏幕大小


但我想知道为什么这个问题会出现在列表视图中的wrap_内容中,如果这是一个已知的问题,为什么它不在文档中…

答案很简单:如果您将
列表视图的布局宽度或布局高度设置为
包装内容
,列表视图将尝试测量每个附加到它的单个视图-这绝对不是您想要的

一般来说,避免在任何时候为ListView或GridView设置
wrap\u content

通过将宽度设置为“wrap\u content”,您告诉ListView的宽度与其最宽的子视图一样宽。因此,ListView必须测量其项,并且要获取项,必须在适配器上调用getView()。这可能会发生多次,具体取决于布局过程的数量、父布局的行为等


请记住,不能保证在适配器上调用getView()的次数,也不能保证调用的顺序。因此,必须实现getView()以尽可能提高效率。底线是,这不是一个问题,这是这种情况下的预期行为。

您是listview romain的父亲。这很重要,我认为LINT应该对此发出警告如果listview只包含两个项,那么测量它们的宽度会很好,但listview没有。因此,问题不在wrap_内容中,而是在ListView中。