ListView的项无法延伸至fill_parent的宽度

4
我有一个自定义的ViewGroup,从xml布局中填充了一个ListView。列表项布局是从另一个xml文件中填充的。所有视图都设置为fill_parent。ListView填充其父级,但ListView项目不会填充。
我尝试将ListView放入LinearLayout并对其进行权重分配。也尝试了RelativeLayout。此外,我还以编程方式构建了ListView,而没有使用xml布局。甚至在将视图添加到ViewGroup之前更改了LayoutParams。
我还考虑了这些帖子:Width of clickable area in ListView w/ onListItemClickIn Android, how can I set a ListView item's height and width?Android Listview width prob
为什么项目无法延伸填充宽度?如何扩展它们? 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);
    }
}

ListView xml布局:

<?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>

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>

MyAddapter类的一部分:

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;
}

添加条目视图膨胀代码。 - Tomer Mor
@TomerMor 我已经添加了我正在使用的自定义BaseAdaptergetView()函数。 - slybloty
MyViewgroup 的用途是什么? - Ron
@userSeven7s 我在不同的活动中使用视图。 - slybloty
为什么要重写onLayout方法?无论如何都要调用super.onLayout。 - Ron
super.onLayout()ViewGroup中不被接受。如果我不重写onLayout(),它将不会绘制任何内容。 - slybloty
2个回答

1
< p > ViewGroup 没有正常工作。我也尝试使用 LinearLayout。但是 RelativeLayout 最终成功地填充了布局。因此,我的 xml 布局和适配器保持不变,但我将主类更改为扩展 RelativeLayout。还删除了 onLayout()

MyView class:

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()
}

0
如果你重写了 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); 
}

ListView 显示了。我可以看到它的背景。但是没有任何项目显示了。我已经尝试了你提供的所有3个选项。 - slybloty
我最终将 ViewGroup 更改为 RelativeLayout - slybloty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接