我有一个包含更多控件的活动:一个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>
答案 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运行在大量屏幕配置上。因此,在某些设备上,将有超过两个项目的空间,但在其他设备上可能少于两个。所以我建议采用以下解决方案:
<强> [编辑] 强>
实际上很简单,基本的想法是:
例如:
//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);
}