我正在尝试将自定义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
答案 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
可以为您完成一些肮脏的工作,因此您可以获得正确的视图类型进行回收。