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<CityResponse.CityBean.AreaBean, BaseViewHolder> { public AreaAdapter(int layoutResId, @Nullable List<CityResponse.CityBean.AreaBean> 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里面实现这个城市弹窗数据的渲染了。
private List<String> list;//字符串列表 private List<CityResponse> provinceList;//省列表数据 private List<CityResponse.CityBean> citylist;//市列表数据 private List<CityResponse.CityBean.AreaBean> arealist;//区/县列表数据 ProvinceAdapter provinceAdapter;//省数据适配器 CityAdapter cityAdapter;//市数据适配器 AreaAdapter areaAdapter;//县/区数据适配器 String provinceTitle;//标题 LiWindow liWindow;//自定义弹窗
使用弹窗
/** * 城市弹窗 */ private void showCityWindow() { provinceList = new ArrayList<>(); citylist = new ArrayList<>(); arealist = new ArrayList<>(); list = new ArrayList<>(); liWindow = new LiWindow(context); final View view = LayoutInflater.from(context).inflate(R.layout.window_city_list, null); ImageView areaBack = (ImageView) view.findViewById(R.id.iv_back_area); ImageView cityBack = (ImageView) view.findViewById(R.id.iv_back_city); TextView windowTitle = (TextView) view.findViewById(R.id.tv_title); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv); liWindow.showRightPopupWindow(view); } //点击事件 @OnClick(R.id.iv_city_select) public void onViewClicked() {//显示城市弹窗 showCityWindow(); }
接下来就是花里胡哨的操作了,首先我希望我的列表市动画展示出来的。
先创建动画文件,在模块中的anim文件
加下
item_animation_from_bottom.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500"> <translate android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromYDelta="50%p" android:toYDelta="0"/> <alpha android:fromAlpha="0" android:toAlpha="1" android:interpolator="@android:anim/accelerate_decelerate_interpolator" /> </set>
item_animation_from_right.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500"> <translate android:interpolator="@android:anim/decelerate_interpolator" android:fromXDelta="100%p" android:toXDelta="0"/> <alpha android:fromAlpha="0.5" android:toAlpha="1" android:interpolator="@android:anim/accelerate_decelerate_interpolator"/> </set>
layout_animation_from_bottom.xml
<?xml version="1.0" encoding="utf-8"?> <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:animation="@anim/item_animation_from_bottom" android:delay="15%" android:animationOrder="normal" />
layout_animation_slide_right.xml
<?xml version="1.0" encoding="utf-8"?> <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:animation="@anim/item_animation_from_right" android:delay="10%" android:animationOrder="normal" />
工具类
在模块的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; /** * 动画RecycleView */ 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);//加载城市列表数据
/** * 省市县数据渲染 * @param recyclerView 列表 * @param areaBack 区县返回 * @param cityBack 市返回 * @param 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(); } }
运行一下:
可以看到城市已经切换好了,数据也拿到了。