我正在开发一款应用程序,显示未来5天内4个不同地区的天气预报。每个区域显示5天,每天都有自己的数据:具有当天名称的TextView,具有当天主要天气条件的TextView,显示天气图标的ImageView,以及具有最小临时和最大值的两个TextView当天的临时工。像这样:
我在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个设置方法来设置文本和图像......我知道,超级/难以置信的糟糕。
这肯定是糟糕的设计。必须有一种方法可以在布局中放置单个视图(日期名称,条件,图像,最小温度和最大温度)并重复使用它。任何的想法?
答案 0 :(得分:1)
您可以创建自定义视图,封装所有演示逻辑,只需在LinearLayout
中添加一些。
您将避免XML代码重复,并且您将能够拥有一个适合您需求的单一,定义明确的小部件。此外,这将减少将数据绑定到现有视图所需的Java代码量。
答案 1 :(得分:1)
假设数据来自某种Weather Api或您自己实现的数据库。
我有2个解决方案来实现这个目标
嵌套的RecyclerView:垂直RecyclerView中的水平RecyclerView
这是更清晰,但是复杂方式可以实现您想要实现的目标。
单一垂直RecyclerView
使用存储视图的Horizontal LinearLayout创建单个布局。
布局结构将是这样的(重复7次)
的LinearLayout(水平)
使用Arraylist填充您的Recyclerview。
我个人会选择第一个,但你可以选择任何可以帮助你的东西。