ScrollView使内容消失

时间:2014-09-06 23:30:51

标签: android listview android-listview

我正在尝试将自定义listView放入scrollView中,当我向下和向上滚动时,由于某种原因,我丢失了listView中的顶级项目,这些项目是TextView和CheckBox。 这是我的代码: activity_program.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_program_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.10"
        android:text="Program name"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/tv_program_info"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_weight="0.20"
        android:text="program info, talk abt sets, reps, weight etc..." />

    <ListView
        android:id="@+id/android:list"
        android:layout_width="match_parent"
        android:layout_height="395dp" >
    </ListView>

    <Button
        android:id="@+id/bt_savework"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.10"
        android:text="Save Workout" />

</LinearLayout>

我的自定义listView包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp" >

    <TextView
        android:id="@+id/tv_exercice_title"
        android:layout_width="270dp"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/cb_exercicedone"
        android:layout_alignParentTop="true"
        android:gravity="center_vertical"
        android:text="Exercice title"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tv_exercice_title"
        android:orientation="horizontal" >

        <CheckBox
            android:id="@+id/cb_setdone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="7dp"
            android:text="Set" />

        <TextView
            android:id="@+id/tv_set_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="3dp"
            android:text="1" />

        <TextView
            android:id="@+id/tv_reps"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="15dp"
            android:text="Reps x" />

        <EditText
            android:id="@+id/et_reps_number"
            android:layout_width="47dp"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="number" />

        <TextView
            android:id="@+id/tv_weight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="15dp"
            android:text="Weight" />

        <EditText
            android:id="@+id/et_weight_number"
            android:layout_width="65dp"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="number" />

        <TextView
            android:id="@+id/tv_kgorlbs"
            android:layout_width="59dp"
            android:layout_height="wrap_content"
            android:text="kg/lbs"
            android:textAppearance="?android:attr/textAppearanceSmall" />
    </LinearLayout>

    <CheckBox
        android:id="@+id/cb_exercicedone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/linearLayout1" />

</RelativeLayout>

在我的ListActivity中,我使用自定义适配器用上面的模板填充ListView,只编辑tv_set_number(现在),然后将tv_exercice_title的可见性设置为&#34;去掉&#34;添加更多集。 如果您认为问题可能出现在我的java代码中,请在评论中告诉我,我会发布它。 请告诉我问题是什么。

这里有一些截图:
在我滚动之前: image 1
滚动后: image 2

1 个答案:

答案 0 :(得分:0)

在我看来,您正在使用ListView生成不同类型的行,而您却错过了一些步骤。您也可以考虑重新考虑结构,因为这可能更适合ExpandableListView:从您发布的屏幕截图看来,您有一组分层属于group的行视图。

ExpandableListView符合此目的,并且还允许折叠/展开组。我要看看它,它非常简单,您只需要让适配器从ExpandableListViewAdapter下降并提供获取群组视图的方法(您的标题&amp;复选框)和项目视图(具有代表,权重等的集合......)

相反,如果您想使用ListView进行制作,则需要关注一些问题(我将 TITLE ROWS 称为带有标题和复选框的人,和常规行到常规行

现在发生的是,当您创建view并且此视图不是 TITLE ROW 时,您将标题的可见性设置为GONE。但是如果你滚动,即。,DOWN和TITLE行必须从上边缘出现,那么你给予回收的视图就是刚刚从下边缘离开屏幕的视图,这可能是一个常规行。所以在getView()中,你不仅需要为常规行设置Visibility为GONE,而且还要为Title Rows设置为VISIBLE。谷歌解释了View回收如何为ListView工作,你马上就能理解它。

ListView提供了一种在这些情况下提供帮助的机制:视图类型:

  • 您声明2&#34;行类型&#34;覆盖适配器中的getViewTypeCount()getItemViewType(int position)。类型0将为TITLE ROWS,类型1将为REGULAR ROWS。

  • getView / convertView中,您将根据类型分别生成/重复使用2个不同的视图。

@Override
public int getViewTypeCount() {
     return 2; // you have 2 different types
}

@Override
public int getItemViewType(int position) {
     if (position IS A TITLE ROW) return 0; else return 1;
}

...然后在getView() {

if (getItemViewType(position) == 0) {

      // it's a TITLE ROW, create / reuse it accordingly

} else {

      // it's a REGULAR ROW, create / reuse it accordingly
}

这样做的好处是ListView可以为您完成一些肮脏的工作,因此您可以获得正确的视图类型进行回收。