Android ListView项目赢得';t扩展宽度以填充父对象

Android ListView项目赢得';t扩展宽度以填充父对象,android,android-layout,android-listview,width,listviewitem,Android,Android Layout,Android Listview,Width,Listviewitem,我有一个自定义的ViewGroup,它从xml布局中展开ListView。列表项布局是从另一个xml文件膨胀而来的。所有视图都设置为fill\u parent。ListView填充其父项,但ListView项不填充 我已尝试将列表视图放入线性布局并为其分配权重。也尝试了RelativeLayout。此外,我还构建了ListViewprogrammaticaly,而没有使用xml布局。甚至在将视图添加到ViewGroup之前更改了LayoutParams 我也考虑了这些帖子: 你知道为什么这些项目

我有一个自定义的
ViewGroup
,它从
xml
布局中展开
ListView
。列表项布局是从另一个
xml
文件膨胀而来的。所有视图都设置为
fill\u parent
ListView
填充其父项,但
ListView
项不填充

我已尝试将
列表视图
放入
线性布局
并为其分配权重。也尝试了
RelativeLayout
。此外,我还构建了
ListView
programmaticaly,而没有使用
xml
布局。甚至在将视图添加到
ViewGroup
之前更改了
LayoutParams

我也考虑了这些帖子:

你知道为什么这些项目没有扩展到填充宽度吗?如何扩展它们

MyViewGroup类:

public class MyViewGroup extends ViewGroup {

    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
        generateMyViewGroup();

    }

    private void generateMyViewGroup()
    {
        ListView main = (ListView) View.inflate(getContext(), R.layout.layout_main, null);

        main.setAdapter(new MyAdapter(getContext()));

        this.addView(main);     
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        this.getChildAt(0).layout(l, t, r, b);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginRight="3dp"
    android:background="#77000000"
    android:cacheColorHint="#00000000"
    android:divider="#00000000"
    android:dividerHeight="0dp"
    android:drawSelectorOnTop="false"
    android:scrollbars="vertical" >
</ListView>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_main_category"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/mainBackground"
    android:gravity="fill_horizontal|center_vertical"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/main_category"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:paddingBottom="7dp"
        android:paddingLeft="20dp"
        android:paddingRight="5dp"
        android:paddingTop="20dp"
        android:text="test"
        android:textColor="@color/mainCategory"
        android:textSize="15sp"
        android:textStyle="bold" />

</LinearLayout>
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if(null == convertView)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.layout_main_category, null);

        viewHolder = new ViewHolder();

        viewHolder.mainItemTitle = (TextView) convertView.findViewById(R.id.main_category);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag(); 
    }

    viewHolder.mainItemTitle.setText("text");

    return convertView;
}

private static class ViewHolder {
        public TextView menuItemTitle;
}
public class MyView extends RelativeLayout {
    //Extra code unchanged ....

    private void generateMyView()
    {
        ListView menu = (ListView) View.inflate(getContext(), R.layout.layout_main, null);

        menu.setAdapter(new MyAdapter(getContext()));

        this.addView(menu);
    }

    //Removed onLayout()
}
ListView
xml
布局:

public class MyViewGroup extends ViewGroup {

    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
        generateMyViewGroup();

    }

    private void generateMyViewGroup()
    {
        ListView main = (ListView) View.inflate(getContext(), R.layout.layout_main, null);

        main.setAdapter(new MyAdapter(getContext()));

        this.addView(main);     
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        this.getChildAt(0).layout(l, t, r, b);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginRight="3dp"
    android:background="#77000000"
    android:cacheColorHint="#00000000"
    android:divider="#00000000"
    android:dividerHeight="0dp"
    android:drawSelectorOnTop="false"
    android:scrollbars="vertical" >
</ListView>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_main_category"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/mainBackground"
    android:gravity="fill_horizontal|center_vertical"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/main_category"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:paddingBottom="7dp"
        android:paddingLeft="20dp"
        android:paddingRight="5dp"
        android:paddingTop="20dp"
        android:text="test"
        android:textColor="@color/mainCategory"
        android:textSize="15sp"
        android:textStyle="bold" />

</LinearLayout>
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if(null == convertView)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.layout_main_category, null);

        viewHolder = new ViewHolder();

        viewHolder.mainItemTitle = (TextView) convertView.findViewById(R.id.main_category);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag(); 
    }

    viewHolder.mainItemTitle.setText("text");

    return convertView;
}

private static class ViewHolder {
        public TextView menuItemTitle;
}
public class MyView extends RelativeLayout {
    //Extra code unchanged ....

    private void generateMyView()
    {
        ListView menu = (ListView) View.inflate(getContext(), R.layout.layout_main, null);

        menu.setAdapter(new MyAdapter(getContext()));

        this.addView(menu);
    }

    //Removed onLayout()
}
属于
MyAddapter
class:

public class MyViewGroup extends ViewGroup {

    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
        generateMyViewGroup();

    }

    private void generateMyViewGroup()
    {
        ListView main = (ListView) View.inflate(getContext(), R.layout.layout_main, null);

        main.setAdapter(new MyAdapter(getContext()));

        this.addView(main);     
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        this.getChildAt(0).layout(l, t, r, b);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginRight="3dp"
    android:background="#77000000"
    android:cacheColorHint="#00000000"
    android:divider="#00000000"
    android:dividerHeight="0dp"
    android:drawSelectorOnTop="false"
    android:scrollbars="vertical" >
</ListView>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_main_category"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/mainBackground"
    android:gravity="fill_horizontal|center_vertical"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/main_category"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:paddingBottom="7dp"
        android:paddingLeft="20dp"
        android:paddingRight="5dp"
        android:paddingTop="20dp"
        android:text="test"
        android:textColor="@color/mainCategory"
        android:textSize="15sp"
        android:textStyle="bold" />

</LinearLayout>
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if(null == convertView)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.layout_main_category, null);

        viewHolder = new ViewHolder();

        viewHolder.mainItemTitle = (TextView) convertView.findViewById(R.id.main_category);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag(); 
    }

    viewHolder.mainItemTitle.setText("text");

    return convertView;
}

private static class ViewHolder {
        public TextView menuItemTitle;
}
public class MyView extends RelativeLayout {
    //Extra code unchanged ....

    private void generateMyView()
    {
        ListView menu = (ListView) View.inflate(getContext(), R.layout.layout_main, null);

        menu.setAdapter(new MyAdapter(getContext()));

        this.addView(menu);
    }

    //Removed onLayout()
}

如果您覆盖了
onLayout
,您也应该覆盖
onMeasure
。。几乎总是

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
   int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
   int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
   this.setMeasuredDimension(parentWidth, parentHeight);
   // this.setLayoutParams(new 
          //   *ParentLayoutType*.LayoutParams(parentWidth,parentHeight));
   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
如果仍然不起作用,也可以使用注释行

更新: 另一种选择是忘记
onLayout
onMeasure
,覆盖
onFinishInflate()
,并将这些行添加到其中。如果您正在从xml中膨胀
MyViewGroup

protected void onFinishInflate () {
    super.onFinishInflate();
    ListView main = (ListView) View.inflate(getContext(), 
                                    R.layout.layout_main,null);
    main.setAdapter(new MyAdapter(getContext()));
    this.addView(main); 
}

视图组
最终无法正常工作。我还尝试使用
线性布局
。但是
RelativeLayout
最终正确地扩展了布局。因此,我的
xml
布局和适配器保持不变,但我更改了主类以扩展
RelativeLayout
。还删除了
onLayout()

MyView类:

public class MyViewGroup extends ViewGroup {

    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
        generateMyViewGroup();

    }

    private void generateMyViewGroup()
    {
        ListView main = (ListView) View.inflate(getContext(), R.layout.layout_main, null);

        main.setAdapter(new MyAdapter(getContext()));

        this.addView(main);     
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        this.getChildAt(0).layout(l, t, r, b);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginRight="3dp"
    android:background="#77000000"
    android:cacheColorHint="#00000000"
    android:divider="#00000000"
    android:dividerHeight="0dp"
    android:drawSelectorOnTop="false"
    android:scrollbars="vertical" >
</ListView>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_main_category"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/mainBackground"
    android:gravity="fill_horizontal|center_vertical"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/main_category"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:paddingBottom="7dp"
        android:paddingLeft="20dp"
        android:paddingRight="5dp"
        android:paddingTop="20dp"
        android:text="test"
        android:textColor="@color/mainCategory"
        android:textSize="15sp"
        android:textStyle="bold" />

</LinearLayout>
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if(null == convertView)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.layout_main_category, null);

        viewHolder = new ViewHolder();

        viewHolder.mainItemTitle = (TextView) convertView.findViewById(R.id.main_category);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag(); 
    }

    viewHolder.mainItemTitle.setText("text");

    return convertView;
}

private static class ViewHolder {
        public TextView menuItemTitle;
}
public class MyView extends RelativeLayout {
    //Extra code unchanged ....

    private void generateMyView()
    {
        ListView menu = (ListView) View.inflate(getContext(), R.layout.layout_main, null);

        menu.setAdapter(new MyAdapter(getContext()));

        this.addView(menu);
    }

    //Removed onLayout()
}

添加项目视图膨胀代码also@TomerMor我已经添加了我正在使用的自定义
BaseAdapter
getView()
函数。MyViewgroup有什么用?@userSeven7s我正在不同的活动中使用视图。为什么要覆盖onLayout?总之,调用super.onLayout...
列表视图显示。我可以看到它的背景。但是没有一件物品再出现了。我已经尝试了您的所有3个选项。我最终将
视图组更改为
相对视图。