Android:wrap_content不能与ListView一起使用

时间:2012-07-02 13:51:37

标签: android listview

我正在开发android。我希望我的列表视图水平包装其内容而不是填充所有宽度。 wrap_content属性不起作用。怎么办?

4 个答案:

答案 0 :(得分:41)

为了在wrap_content中达到ListView高度,我们需要使用CustomListView extends我们的原生ListView

MyListView.java

public class MyListView extends ListView {

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

    public MyListView(Context context) {
        super(context);
    }

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

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

}

layout中使用自定义视图,

layout.xml

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

答案 1 :(得分:36)

作为Romain Guy(Google工程师使用UI工具包)在帖子中说

通过将宽度设置为wrap_content,您可以告诉ListView与其最宽的子项一样宽。因此,ListView必须测量其项目并获取必须在适配器上调用getView()的项目。这可能会发生几次,具体取决于布局传递的数量,父布局的行为等。

因此,如果将ListView的布局宽度或布局高度设置为wrap_content,ListView将尝试测量附加到它的每个视图 - 这绝对不是您想要的。

请记住:避免始终为ListView或GridView设置wrap_content,有关详细信息,请参阅此Google I/O video,了解listview的世界

答案 2 :(得分: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

答案 3 :(得分: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);
}

}

XML示例

<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=""  />