处理大量Textview的最佳方法

时间:2014-08-18 14:42:29

标签: android

我必须在xml:

中制作它

enter image description here

目前我有这个:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:pixlui="http://schemas.android.com/apk/com.neopixl.pixlui"
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <include
        layout="@layout/view_general_properties"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp" />

    <include
        layout="@layout/view_property_interior_properties"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp" />

</LinearLayout>
</ScrollView>

这是view_general_properties:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="12dp"
android:paddingRight="12dp">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:text="@string/general_properties"
    android:textAllCaps="true"
    android:textSize="@dimen/title_fontsize" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.66"
        android:text="@string/total_living_area" />

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="220 m²" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.66"
        android:text="@string/number_of_fronts" />

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="1" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.66"
        android:text="@string/number_of_accommodation_units" />

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="2" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.66"
        android:text="@string/number_of_floors" />

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="4" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.66"
        android:text="@string/condition_of_the_building" />

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="Uitstekend" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.66"
        android:text="@string/frontage_street" />

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="6m" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.66"
        android:text="@string/year" />

    <TextView
        style="@style/property_detail_label_style"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:text="1902" />

</LinearLayout>

</LinearLayout>

这很好用,但由于我有很多重复的代码,我想知道是否有更好的解决方案。

谢谢!

3 个答案:

答案 0 :(得分:1)

有很多方法可以改进它。

平凡地说,每个TextView的所有常见样式属性都可以拉出一个样式。请参阅Styles and Themes的开发人员文档。

我会更进一步,为您的内容的一行创建一个单独的布局资源文件,其中包含两个TextView。省略文本值,但为每个id分配TextView值。

<强> my_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        style="@style/property_detail_label_style"
        android:id="@+id/label"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.66" />
    <TextView
        style="@style/property_detail_label_style"
        android:id="@+id/value"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.33" />
</LinearLayout>

然后,在您的代码中,为每个数据项手动为其中一个数据项充气,并将其动态添加到列表中。

View item;

for ( /* each data item in my list */ ) {
    item = inflater.inflate(R.layout.my_list_item, containerView, true);
    TextView label = (TextView) item.findViewById(R.id.label);
    TextView value = (TextView) item.findViewById(R.id.value);
    label.setText(dataItem.label);
    value.setText(dataItem.value);
}

其中containerView是保留列表的外部LinearLayout

答案 1 :(得分:1)

是的,有更好的方法。请改用ListView。如果你不知道如何使用ListViewAdapters做谷歌,因为有数以千计的教程和示例。

我可以看到一些建议使用Style的答案,是的,这些都是很好的建议,但是对于这么长的列表,你会浪费内存并且滚动不会很顺利。 ListView会更有效率。

我建议的具体细节是:

  • 覆盖adapter上的getViewTypeCount()并返回2。这意味着您的列表中有两种不同类型的视图。一个用于标题(粗体字母),另一个用于项目/价格。
  • 覆盖getItemViewType(int)并返回0如果它是标题位置(位置0,8等),否则返回1
  • 然后在适配器的getView()上,您会检查if(getItemViewType(position) == 0)做标题,else执行该项目。
  • 标题XML可能只是TextView,具有正确的样式bold,大小,填充。
  • 项目XML可能是LinearLayoutorientation水平,其中有两个TextView,项目名称和值。
  • 在这两个项目上,您可以应用普通视图回收和查看持有人模式,您可以在任何ListView tuto / example
  • 上找到

答案 2 :(得分:0)

我将使用的解决方案是使用附加了数组适配器的列表视图来实现它。

在列表视图中,有很多方法可以包含子标题(ALGEMENE KENMERKEN,INTERIER)。

您将在适配器实现中获得可重用性。