android - ListView 的 Layout_width

标签 android listview

好的,我遇到了 listView 的属性 layout_width 的问题。

在我的项目中,我的 ListView 有一个不适合屏幕宽度的背景图像。因此,我将 layout_width 设置为 wrap_content,并将 listView 水平居中。

这似乎是个坏主意,因为在适配器中,调用 GetView 方法的次数超过显示单元格数的 3 倍。如果我在 fill_parent 上设置 layout_width,问题就解决了。我创建了一个显示问题的简单项目。

这是 Activity 的 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>

最后是 Activity :

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 背景的图像以添加一些透明边框以适合屏幕尺寸。

但我想知道为什么这个问题会出现在 ListView 上的 wrap_content 中,如果它是一个已知问题,为什么它不在文档中......

最佳答案

通过将宽度设置为“wrap_content”,您是在告诉 ListView 与其最宽的子项一样宽。因此,ListView 必须测量其项目并获取它必须调用 Adapter 上的 getView() 的项目。这可能会发生多次,具体取决于布局遍数、父布局的行为等。

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

关于android - ListView 的 Layout_width,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4270278/

相关文章:

java - Android - 将值从 ListFragment 传递到另一个 ListFragment

java - TextColor 与 TextColorPrimary 与 TextColorSecondary

c# - Wpf 多个 ListView 绑定(bind)到具有不同排序描述的同一集合

java - Facebook AnE Android : Login Activity - . ApiException:代码 1:发生未知错误

android - 更改首选项摘要

c# - 为什么 SubItems.Clear() 也会删除 Name 属性?

c# - 在 ListView 中绑定(bind)图像只显示字符串

java - 将 ListView 值传递给另一个 Activity 中的多个 EditText

android - 想要创建一个在特定区域可点击的半 donut 形状按钮

java - 如何正确设置GridView?