Android:wrap_content不能与ListView一起使用

我在android上工作。 我想我的列表视图水平包装其内容,而不是填充所有的宽度。 wrap_content属性不起作用。 该怎么办?

Solutions Collecting From Web of "Android:wrap_content不能与ListView一起使用"

正如Romain Guy (谷歌工程师在UI工具箱上工作)在他的post中所说

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

所以,如果你将你的ListView的布局宽度或布局高度设置为wrap_content那么ListView将会尝试测量附加到它的每一个视图 – 这绝对不是你想要的。

请记住:避免wrap_content为ListView或GridViews设置wrap_content ,更多详细信息请参阅此Google I / Ovideo讨论listview的世界

为了在ListView实现wrap_content高度,我们需要使用extends我们的本地ListView CustomListView

MyListView.java

 public class MyListView extends ListView { private android.view.ViewGroup.LayoutParams params; private int oldCount = 0; public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { if (getCount() != oldCount) { int height = getChildAt(0).getHeight() + 1 ; oldCount = getCount(); params = getLayoutParams(); params.height = getCount() * height; setLayoutParams(params); } super.onDraw(canvas); } } 

在你的layout使用像这样的自定义视图,

layout.xml

 <com.yourpackagename.MyListView ... android:layout_width="match_parent" android:layout_height="wrap_content" ... /> 
 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列表显示

为了在列表视图上进行高效devise,您可以看到这个ListView世界

它可以像这个例子一样使用LinearLayout Create来实现

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