上一篇:Android 天气APP(七)城市切换 之 城市数据源
自定义弹窗既然时弹窗,那就不能让它平白无奇的出现,给一个动画效果,闪亮登场,完美谢幕。
为了让点击的时候有一个效果,在模块的res文件下的drawable下创建一个rounded_corners.xml的样式文件,点击的水波纹效果
代码如下
接下来在res文件下下新建一个drawable-v21的文件夹,文件夹下创建一个bg_white.xml
代码如下:
点击的样式做好了,接下来创建城市列表的item
在项目的layout文件夹下创建一个名为item_city_list.xml的布局文件
接下来就是要创建一个实体Bean用来接收JSON中解析出来的城市数据,里面包含了省、市、区/县
在项目的bean包下新建一个CityResponse
代码如下:
package com.llw.goodweather.bean;
import java.util.List;
public class CityResponse {
private String name;
private List city;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getCity() {
return city;
}
public void setCity(List city) {
this.city = city;
}
public static class CityBean {
private String name;
private List area;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static class AreaBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
}
接下来创建适配器,需要三个适配器,省、市、区/县。在adapter包下创建ProvinceAdapter、CityAdapter、AreaAdapter
ProvinceAdapter.java
package com.llw.goodweather.adapter;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.llw.goodweather.R;
import com.llw.goodweather.bean.CityResponse;
import java.util.List;
public class ProvinceAdapter extends BaseQuickAdapter {
public ProvinceAdapter(int layoutResId, @Nullable List data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, CityResponse item) {
helper.setText(R.id.tv_city,item.getName());//省名称
helper.addOnClickListener(R.id.item_city);//点击之后进入市级列表
}
}
CityAdapter.java
package com.llw.goodweather.adapter;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.llw.goodweather.R;
import com.llw.goodweather.bean.CityResponse;
import java.util.List;
public class CityAdapter extends BaseQuickAdapter {
public CityAdapter(int layoutResId, @Nullable List data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, CityResponse.CityBean item) {
helper.setText(R.id.tv_city,item.getName());//市名称
helper.addOnClickListener(R.id.item_city);//点击事件 点击进入区/县列表
}
}
AreaAdapter.java
package com.llw.goodweather.adapter;
import androidx.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.llw.goodweather.R;
import com.llw.goodweather.bean.CityResponse;
import java.util.List;
public class AreaAdapter extends BaseQuickAdapter {
public AreaAdapter(int layoutResId, @Nullable List data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, CityResponse.CityBean.AreaBean item) {
helper.setText(R.id.tv_city,item.getName());//区/县的名称
helper.addOnClickListener(R.id.item_city);//点击事件 点击之后得到区/县 然后查询天气数据
}
}
万事具备了,接下来就是在MainActivity.java里面实现这个城市弹窗数据的渲染了。
item_animation_from_right.xml
layout_animation_from_bottom.xml
layout_animation_slide_right.xml
工具类
在模块的utils包下创建RecyclerViewAnimation
RecyclerViewAnimation.java
代码如下:
package com.llw.mvplibrary.utils;
import android.content.Context;
import android.view.animation.AnimationUtils;
import android.view.animation.LayoutAnimationController;
import androidx.recyclerview.widget.RecyclerView;
import com.llw.mvplibrary.R;
public class RecyclerViewAnimation {
//数据变化时显示动画 底部动画
public static void runLayoutAnimation(final RecyclerView recyclerView) {
final Context context = recyclerView.getContext();
final LayoutAnimationController controller =
AnimationUtils.loadLayoutAnimation(context, R.anim.layout_animation_from_bottom);
recyclerView.setLayoutAnimation(controller);
recyclerView.getAdapter().notifyDataSetChanged();
recyclerView.scheduleLayoutAnimation();
}
//数据变化时显示动画 右侧动画
public static void runLayoutAnimationRight(final RecyclerView recyclerView) {
final Context context = recyclerView.getContext();
final LayoutAnimationController controller =
AnimationUtils.loadLayoutAnimation(context, R.anim.layout_animation_slide_right);
recyclerView.setLayoutAnimation(controller);
recyclerView.getAdapter().notifyDataSetChanged();
recyclerView.scheduleLayoutAnimation();
}
}
MainActivity.java代码中
initCityData(recyclerView,areaBack,cityBack,windowTitle);//加载城市列表数据
private void initCityData(RecyclerView recyclerView,ImageView areaBack,ImageView cityBack,TextView windowTitle) {
//初始化省数据 读取省数据并显示到列表中
try {
InputStream inputStream = getResources().getAssets().open("City.txt");//读取数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer stringBuffer = new StringBuffer();
String lines = bufferedReader.readLine();
while (lines != null) {
stringBuffer.append(lines);
lines = bufferedReader.readLine();
}
final JSONArray Data = new JSONArray(stringBuffer.toString());
//循环这个文件数组、获取数组中每个省对象的名字
for (int i = 0; i < Data.length(); i++) {
JSONObject provinceJsonObject = Data.getJSONObject(i);
String provinceName = provinceJsonObject.getString("name");
CityResponse response = new CityResponse();
response.setName(provinceName);
provinceList.add(response);
}
//定义省份显示适配器
provinceAdapter = new ProvinceAdapter(R.layout.item_city_list, provinceList);
LinearLayoutManager manager = new LinearLayoutManager(context);
recyclerView.setLayoutManager(manager);
recyclerView.setAdapter(provinceAdapter);
provinceAdapter.notifyDataSetChanged();
runLayoutAnimationRight(recyclerView);//动画展示
provinceAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
try {
//返回上一级数据
cityBack.setVisibility(View.VISIBLE);
cityBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
recyclerView.setAdapter(provinceAdapter);
provinceAdapter.notifyDataSetChanged();
cityBack.setVisibility(View.GONE);
windowTitle.setText("中国");
}
});
//根据当前位置的省份所在的数组位置、获取城市的数组
JSONObject provinceObject = Data.getJSONObject(position);
windowTitle.setText(provinceList.get(position).getName());
provinceTitle = provinceList.get(position).getName();
final JSONArray cityArray = provinceObject.getJSONArray("city");
//更新列表数据
if (citylist != null) {
citylist.clear();
}
for (int i = 0; i < cityArray.length(); i++) {
JSONObject cityObj = cityArray.getJSONObject(i);
String cityName = cityObj.getString("name");
CityResponse.CityBean response = new CityResponse.CityBean();
response.setName(cityName);
citylist.add(response);
}
cityAdapter = new CityAdapter(R.layout.item_city_list, citylist);
LinearLayoutManager manager1 = new LinearLayoutManager(context);
recyclerView.setLayoutManager(manager1);
recyclerView.setAdapter(cityAdapter);
cityAdapter.notifyDataSetChanged();
runLayoutAnimationRight(recyclerView);
cityAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
try {
//返回上一级数据
areaBack.setVisibility(View.VISIBLE);
areaBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
recyclerView.setAdapter(cityAdapter);
cityAdapter.notifyDataSetChanged();
areaBack.setVisibility(View.GONE);
windowTitle.setText(provinceTitle);
arealist.clear();
}
});
//根据当前城市数组位置 获取地区数据
windowTitle.setText(citylist.get(position).getName());
JSONObject cityJsonObj = cityArray.getJSONObject(position);
JSONArray areaJsonArray = cityJsonObj.getJSONArray("area");
if (arealist != null) {
arealist.clear();
}
if(list != null){
list.clear();
}
for (int i = 0; i < areaJsonArray.length(); i++) {
list.add(areaJsonArray.getString(i));
}
Log.i("list", list.toString());
for (int j = 0; j < list.size(); j++) {
CityResponse.CityBean.AreaBean response = new CityResponse.CityBean.AreaBean();
response.setName(list.get(j).toString());
arealist.add(response);
}
areaAdapter = new AreaAdapter(R.layout.item_city_list, arealist);
LinearLayoutManager manager2 = new LinearLayoutManager(context);
recyclerView.setLayoutManager(manager2);
recyclerView.setAdapter(areaAdapter);
areaAdapter.notifyDataSetChanged();
runLayoutAnimationRight(recyclerView);
areaAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
mPresent.todayWeather(context,arealist.get(position).getName());//今日天气
mPresent.weatherForecast(context, arealist.get(position).getName());//天气预报
mPresent.lifeStyle(context, arealist.get(position).getName());//生活指数
liWindow.closePopupWindow();
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
运行一下:
可以看到城市已经切换好了,数据也拿到了。
下一篇:Android 天气APP(九)细节优化、必应每日一图
作者:初学者-Study