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个选项。我最终将视图组更改为相对视图。