多次添加相同的视图 - 重用布局

时间:2016-06-24 15:09:43

标签: android reusability

我正在开发一款应用程序,显示未来5天内4个不同地区的天气预报。每个区域显示5天,每天都有自己的数据:具有当天名称的TextView,具有当天主要天气条件的TextView,显示天气图标的ImageView,以及具有最小临时和最大值的两个TextView当天的临时工。像这样:

enter image description here

我在SUPER AWFUL layout.xml文件中实现了它,分别处理4个区域中所有20天的TextView和ImageView:

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

        <TextView
            android:id="@+id/tv_weather_forecats_title"
            style="@style/tv_weather_11"
            android:text="@string/extended_forecast" />

        <TextView
            android:id="@+id/tv_fore_title_city"
            style="@style/tv_weather_6"
            android:text="@string/title_city" />

        <LinearLayout style="@style/ll_weather_1">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day1_city"
                    style="@style/tv_weather_7"
                    android:text="Mon"/>

                <TextView
                    android:id="@+id/tv_fore_cond1_city"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day1_city"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds" />

                <TextView
                    android:id="@+id/tv_fore_min_day1_city"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day1_city"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day2_city"
                    style="@style/tv_weather_7"
                    android:text="Tue"/>

                <TextView
                    android:id="@+id/tv_fore_cond2_city"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day2_city"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day2_city"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day2_city"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day3_city"
                    style="@style/tv_weather_7"
                    android:text="Wed"/>

                <TextView
                    android:id="@+id/tv_fore_cond3_city"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day3_city"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day3_city"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day3_city"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day4_city"
                    style="@style/tv_weather_7"
                    android:text="Thu"/>

                <TextView
                    android:id="@+id/tv_fore_cond4_city"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day4_city"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day4_city"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day4_city"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day5_city"
                    style="@style/tv_weather_7"
                    android:text="Fri"/>

                <TextView
                    android:id="@+id/tv_fore_cond5_city"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day5_city"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day5_city"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day5_city"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:background="@color/colorDarkTextDivider" />

        <TextView
            android:id="@+id/tv_fore_title_east"
            style="@style/tv_weather_6"
            android:text="@string/title_east" />

        <LinearLayout style="@style/ll_weather_1">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day1_east"
                    style="@style/tv_weather_7"
                    android:text="Mon"/>

                <TextView
                    android:id="@+id/tv_fore_cond1_east"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day1_east"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day1_east"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day1_east"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day2_east"
                    style="@style/tv_weather_7"
                    android:text="Tue"/>

                <TextView
                    android:id="@+id/tv_fore_cond2_east"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day2_east"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day2_east"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day2_east"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day3_east"
                    style="@style/tv_weather_7"
                    android:text="Wed"/>

                <TextView
                    android:id="@+id/tv_fore_cond3_east"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day3_east"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day3_east"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day3_east"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day4_east"
                    style="@style/tv_weather_7"
                    android:text="Thu"/>

                <TextView
                    android:id="@+id/tv_fore_cond4_east"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day4_east"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds" />

                <TextView
                    android:id="@+id/tv_fore_min_day4_east"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day4_east"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day5_east"
                    style="@style/tv_weather_7"
                    android:text="Fri"/>

                <TextView
                    android:id="@+id/tv_fore_cond5_east"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day5_east"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day5_east"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day5_east"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:background="@color/colorDarkTextDivider" />

        <TextView
            android:id="@+id/tv_fore_title_south"
            style="@style/tv_weather_6"
            android:text="@string/title_south" />

        <LinearLayout style="@style/ll_weather_1">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day1_south"
                    style="@style/tv_weather_7"
                    android:text="Mon"/>

                <TextView
                    android:id="@+id/tv_fore_cond1_south"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day1_south"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day1_south"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day1_south"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day2_south"
                    style="@style/tv_weather_7"
                    android:text="Tue"/>

                <TextView
                    android:id="@+id/tv_fore_cond2_south"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day2_south"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds"/>

                <TextView
                    android:id="@+id/tv_fore_min_day2_south"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day2_south"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day3_south"
                    style="@style/tv_weather_7"
                    android:text="Wed"/>

                <TextView
                    android:id="@+id/tv_fore_cond3_south"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day3_south"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds" />

                <TextView
                    android:id="@+id/tv_fore_min_day3_south"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day3_south"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day4_south"
                    style="@style/tv_weather_7"
                    android:text="Thu"/>

                <TextView
                    android:id="@+id/tv_fore_cond4_south"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day4_south"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds" />

                <TextView
                    android:id="@+id/tv_fore_min_day4_south"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day4_south"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_fore_day5_south"
                    style="@style/tv_weather_7"
                    android:text="Fri"/>

                <TextView
                    android:id="@+id/tv_fore_cond5_south"
                    style="@style/tv_weather_8"
                    android:text="Light Rain"/>

                <ImageView
                    android:id="@+id/iv_fore_ic_day5_south"
                    style="@style/iv_weather_1"
                    android:src="@drawable/ic_main_broken_clouds" />

                <TextView
                    android:id="@+id/tv_fore_min_day5_south"
                    style="@style/tv_weather_9"
                    android:text="5"/>

                <TextView
                    android:id="@+id/tv_fore_max_day5_south"
                    style="@style/tv_weather_10"
                    android:text="15"/>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

在Java文件中,我有100个视图声明,并使用100行来获取视图的实例,另外100个设置方法来设置文本和图像......我知道,超级/难以置信的糟糕。

这肯定是糟糕的设计。必须有一种方法可以在布局中放置单个视图(日期名称,条件,图像,最小温度和最大温度)并重复使用它。任何的想法?

2 个答案:

答案 0 :(得分:1)

您可以创建自定义视图,封装所有演示逻辑,只需在LinearLayout中添加一些。

您将避免XML代码重复,并且您将能够拥有一个适合您需求的单一,定义明确的小部件。此外,这将减少将数据绑定到现有视图所需的Java代码量。

答案 1 :(得分:1)

假设数据来自某种Weather Api或您自己实现的数据库。

我有2个解决方案来实现这个目标

  1. 嵌套的RecyclerView:垂直RecyclerView中的水平RecyclerView

    • 您将拥有水平垂直布局

      enter image description here

      此布局每天重复7次。

    • 您的Vertical RecyclerView将是此类Horizo​​ntal RecyclerView(适用于地区)的集合

    • 使用ArrayList并填充您的RecyclerView。

  2. 这是更清晰,但是复杂方式可以实现您想要实现的目标。

    1. 单一垂直RecyclerView

      • 使用存储视图的Horizo​​ntal LinearLayout创建单个布局。

        布局结构将是这样的(重复7次)

        的LinearLayout(水平)

        • 的LinearLayout(垂直)
        • 5个文字视图
      • 使用Arraylist填充您的Recyclerview。

    2. 我个人会选择第一个,但你可以选择任何可以帮助你的东西。