Android ListView不会扩展

时间:2013-08-06 01:35:29

标签: android android-layout android-listview

我有一个包含更多控件的活动:一个Spinner,两个编辑框,一个按钮,一些textview和一个listview,然后是另一个按钮。全部采用垂直布局。

单击第一个按钮,我将新项添加到列表视图(基于其他编辑框值和微调器值)。这样,listview不断增长。 我想知道是否有任何方法可以使listview的高度在每次添加后自动展开。 此外,扩展后底部按钮应保留在底部。

我想要这个,因为我的listview非常小,因为布局上有很多控件。它几乎不会同时显示2个项目。因此用户无法一次看到所有添加的项目,他必须在 2项目列表视图中滚动才能看到所有项目。这看起来很糟糕而且很愚蠢。而且用户必须知道列表中有超过2个项目,因为没有直接看到它们,他可以假设有2个项目,并且应用程序不起作用,因为没有新的项目出现。 我希望我能说清楚。

请告诉我,在这种情况下是否可能或最佳方法是什么?

我的布局如下:

<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"
    tools:context=".NewStuff" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:text="Back" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:gravity="center"
        android:text="Page title"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:text="Choose item" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_below="@+id/textView2" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/spinner1"
        android:layout_below="@+id/spinner1"
        android:text="Property 1" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView3"
        android:layout_alignRight="@+id/spinner1"
        android:layout_below="@+id/textView3"
        android:ems="10"
        android:inputType="numberDecimal" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText1"
        android:layout_below="@+id/editText1"
        android:text="Property 2" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView4"
        android:layout_alignRight="@+id/editText1"
        android:layout_below="@+id/textView4"
        android:ems="10"
        android:inputType="numberDecimal" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText2"
        android:layout_alignRight="@+id/editText2"
        android:layout_below="@+id/editText2"
        android:text="Add to listview" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button1"
        android:layout_toLeftOf="@+id/button1"
        android:text="Save listview contents" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/button1"
        android:layout_alignLeft="@+id/button2"
        android:layout_below="@+id/button2" >

    </ListView>

</RelativeLayout>

3 个答案:

答案 0 :(得分:3)

您需要自定义列表视图。

public class ExpandedListView extends ListView {

private android.view.ViewGroup.LayoutParams params;
private int old_count = 0;

public ExpandedListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
    if (getCount() != old_count) {
        old_count = getCount();
        params = getLayoutParams();
        params.height = getCount() * (old_count > 0 ? getChildAt(0).getHeight() + 2 : 0);
        setLayoutParams(params);
    }
    super.onDraw(canvas);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
   if(ev.getAction()== MotionEvent.ACTION_MOVE)
      return true;
   return super.dispatchTouchEvent(ev);
}

}

此列表视图将随其子项数量增长而增长。 在你的xml中你必须使用

<your.path.ExpandedListView
                android:layout_width="match_parent"
                android:layout_height="0dip"
                android:layout_weight="1" />

希望这会有所帮助

答案 1 :(得分:1)

使用LinearLayout保存所有内容,并在ListView上使用layout_weight来完成此任务:

<ListView android:id="@+id/listView1"
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight="1"
          android:layout_above="@+id/button1"
          android:layout_alignLeft="@+id/button2"
          android:layout_below="@+id/button2"/>

答案 2 :(得分:1)

屏幕上有太多项目,请记住Android运行在大量屏幕配置上。因此,在某些设备上,将有超过两个项目的空间,但在其他设备上可能少于两个。所以我建议采用以下解决方案:

  1. 如果没有那么多项目并且它们不涉及显示大图形,您可以将ListView更改为LinearLayout,并动态插入所有项目。然后将整个视图封装在ScrollerView中,以便用户可以在任何地方滚动以查看完整列表。
  2. 在不同的活动/片段中显示结果,其效果是强调用户正在搜索的数据
  3. <强> [编辑]

    实际上很简单,基本的想法是:

    1. 为每个项目,膨胀所需的视图并设置其布局参数
    2. 将其添加到父视图
    3. 重复步骤1&amp; 2
    4. 例如:

      //the base LinearLayout that you want to insert items
      LinearLayout content = (LinearLayout) fragView.findViewById(R.id.booking_content);
      
      //for each item in the LinearLayout
      for(int i=0; i<itemsList.size(); i++) {
          //inflate layout as you normally would for a ListView
          ViewGroup base = (ViewGroup) inflater.inflate(
                  R.layout.include_no_movie, null);
          //sets the layout parameter of the child view
          LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
                  LinearLayout.LayoutParams.MATCH_PARENT,
                  LinearLayout.LayoutParams.WRAP_CONTENT);
          //adds the view
          content.addView(base, param);
      }