6

我正在创建一个使用 ListView 的 Android 应用程序。ListView 由 CheckedTextView 列表项组成。我的活动在顶部包含一个 EditText,在其下方包含一个 TextView,在底部包含一个 Button。TextView 和按钮之间的空间是ListView 占用的区域。现在,由于我的 ListView 包含的项目很少,因此 ListView 的整个空间都没有被它们占用。此外,剩余空间显然因设备而异。我想知道的是是否有办法改变 ListView 的行高,以便覆盖分配给 ListView 的整个空间。而且,如果需要添加一些项目,行高可能会相应地自行调整。我在下面提供了一些代码片段,以便于理解我的布局是什么样的。

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="#D0D0D0"
tools:context=".MainActivity" >

<Button
    android:id="@+id/addcourse"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:text="Add Course" />

<EditText
    android:id="@+id/coursenameet"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:ems="10"
    android:layout_marginBottom="2dp"
    android:layout_marginTop="2dp"
    android:hint="Course Name" 
    android:inputType="textCapWords" >

    <requestFocus />
</EditText>

<View
    android:id="@+id/divider"
    android:layout_width="match_parent"
    android:layout_height="3dp"
    android:layout_below="@+id/coursenameet"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="5dp"
    android:background="@android:color/darker_gray" >
</View>

<TextView
    android:id="@+id/weekdaytv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/divider"
    android:layout_marginBottom="3dp"
    android:layout_marginTop="3dp"
    android:layout_centerHorizontal="true"
    android:text="Select weekdays for this Course" >
</TextView>

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/addcourse"
    android:layout_below="@+id/weekdaytv"
    android:divider="#FFFFFF"
    android:dividerHeight="2px">

</ListView>

</RelativeLayout>

这些项目是使用 BaseAdapter 实现的 CheckedTextView。BaseAdapter 类的 View 方法是

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    int colorpos = position % colors.length;
    if(v == null){
        LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.listviewitem, null);
    }
    CheckedTextView newrow = (CheckedTextView) v.findViewById(R.id.checkedtextview);
    v.setBackgroundColor(colors[colorpos]);
    newrow.setTextColor(Color.BLACK);
    newrow.setText(items[position]);
    return v;
}

编辑:主要活动的片段

lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    adapter = new ItemsAdapter(MainActivity.this, weekdays, 6, lv.getBottom() - lv.getTop());
    lv.setAdapter(adapter);

    lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            CheckedTextView ctv = (CheckedTextView) arg1;
            adapter.toggle(ctv);
        }
    });
4

3 回答 3

11

嗨创建这样的课程

public class Utility {

    public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
    }


 }

在您想要动态更改列表视图中的行高的位置调用此方法。

 Utility.setListViewHeightBasedOnChildren(YourListView);

如需更多参考..希望这会对您有所帮助。

于 2013-06-14T13:47:24.367 回答
0

对于那些仍然有错误的人

 listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);

像这样编写这些代码行。

if (listItem instanceof ViewGroup)

listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        listItem.measure(0, 0);
于 2013-10-26T05:54:22.523 回答
0

要将您设置ListView为填充分配的整个空间,您可以在以下位置设置 listView 属性XML

android:fillViewport=”true”

或在代码中:

myListView.setFillViewport(true);

如果要更改单元格的大小,可以计算ViewParams设置。例如,对于单个单元格,您可以使用:

AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, AbsListView.LayoutParams.FILL_PARENT);
v.setLayoutParams(params);

对于n 个单元格,您可以根据 ListView 的大小计算垂直大小:

int n = /* number of cells */ 3;
int height = (myListView.getBottom() - myListView.getTop());
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT, height/n);
v.setLayoutParams(params);
于 2013-06-14T13:17:57.880 回答