我正在开发 Android 应用。我希望我的列表视图只在水平方向上自适应其内容大小,而不是填满整个宽度。但是,使用 wrap_content 属性并没有实现这个效果。我该怎么做?
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"
... />
正如Romain Guy(谷歌工程师负责UI工具包)在他的文章中所说:
通过将宽度设置为wrap_content
,您告诉ListView要与其子项中最宽的一项一样宽。因此,ListView必须测量其项目,并获取项目,它必须在适配器上调用getView()。这可能会发生多次,具体取决于布局传递的次数、父布局的行为等。
因此,如果您将ListView的布局宽度或布局高度设置为wrap_content
,则ListView将尝试测量附加到它的每个视图-这绝对不是您想要的。
请记住:始终避免为ListViews或GridViews设置wrap_content
,有关详细信息,请参见此Google I/O视频,讨论ListView的世界。
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="" />
I want my list view to wrap its content horizontally and not to fill all the width.
我知道回答这个问题有点晚了。但是在我看来,如果你想让你的ListView具有类似wrap_content的行为,你可以将其开始和结束的边距设置为一些静态值。这在我的情况下起作用了。 如果你担心在各种屏幕尺寸上进行操作,有一个非常有用的库可以处理这种情况。 Scalable DP. 一定要在github上检查一下。