高德天气应用开发之六:android RecyclerView 封装及使用

版权声明:本文为博主原创文章,未经允许不得转载,如有问题,欢迎指正,谢谢! https://blog.csdn.net/cbk861110/article/details/86666392

【版权说明】

1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564

2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

-------------------------------------------

基于MVVM框架的高德天气APP:


功能点实现说明:

  • RecyclerView封装:Android推荐控件,优于ListView,处理不同类型的ItemView封装使用;

一、技术背景:

RecyclerView可以实现包含不同ui&data的Item,但Android原生机制RecyclerView.Adapter此场景使用复杂,不便于扩展。

二、技术实现(工厂方式实现生成不同ui&data的Item object):

1. CityWeatherRecyclerAdapter.java实现:

public class CityWeatherRecyclerAdapter extends RecyclerView.Adapter<BaseItemViewHolder> {
    private List<BaseItemBean> mItemDatas = new ArrayList<>();

    public CityWeatherRecyclerAdapter() {
    }

    public void setAdapterData(List<BaseItemBean> datas) {
        mItemDatas.clear();
        mItemDatas = datas;
        notifyDataSetChanged();
    }

    @Override
    public BaseItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return ItemViewHolderFactory.getViewHolderByType(parent, viewType);
    }

    @Override
    public void onBindViewHolder(BaseItemViewHolder holder, int position) {
        holder.getIViewItem().bindView(mItemDatas.get(position));
    }

    @Override
    public int getItemViewType(int position) {
        return (mItemDatas.get(position) == null) ? 0 : mItemDatas.get(position).getViewItemType();
    }

    @Override
    public int getItemCount() {
        return mItemDatas.size();
    }
}

2. 静态工厂生成不同不同ui&data的Item:

public class ItemViewHolderFactory {
    public static BaseItemViewHolder getViewHolderByType(ViewGroup parent, int type) {
        if (type == ItemViewType.RV_CURRENT_WEATHER) {
            return new BaseItemViewHolder(CurWeatherViewItem.getViewItem(),parent);
        } else if (type == ItemViewType.RV_FORECAST_DAY_WEATHER) {
            return new BaseItemViewHolder(ForcastDayViewItem.getViewItem(),parent);
        }
        return null;
    }
}
public class BaseItemViewHolder extends RecyclerView.ViewHolder {
    private IViewItem mIViewItem;
    public BaseItemViewHolder(IViewItem viewItem , ViewGroup parent) {
        super(viewItem.createView(parent));
        mIViewItem = viewItem;
    }

    public IViewItem getIViewItem(){
        return mIViewItem;
    }
}
public abstract class BaseItemBean {
    private final int mViewItemType;

    public BaseItemBean(int viewItemType) {
        this.mViewItemType = viewItemType;
    }

    public int getViewItemType() {
        return mViewItemType;
    }
}
public class ItemViewType { //待优化为enum type
    public final static int RV_CURRENT_WEATHER =1;
    public final static int RV_FORECAST_DAY_WEATHER =2;
}

3 . 不同RecyclerAdapter Item 实现举例:

public class CurWeatherViewItem implements IViewItem<LiveWeatherBean> {
    private CurWeatherBinding mDataBinding;

    public static CurWeatherViewItem getViewItem() {
        return new CurWeatherViewItem();
    }

    public View createView(ViewGroup parent) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_cur_weather, parent, false);
        mDataBinding = CurWeatherBinding.bind(itemView);
        return itemView;
    }

    public void bindView(@NonNull LiveWeatherBean data) {
        mDataBinding.setViewModel(new CurWeatherViewModel(data));
    }
}
public class ForcastDayViewItem implements IViewItem<DayForecastBean> {
    private WeatherForecastDayBinding mDataBinding;

    public static ForcastDayViewItem getViewItem() {
        return new ForcastDayViewItem();
    }

    public View createView(ViewGroup parent) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_forecast_day, parent, false);
        mDataBinding = WeatherForecastDayBinding.bind(itemView);
        return itemView;
    }

    public void bindView(@NonNull DayForecastBean data) {
        mDataBinding.setViewModel(new ForecastDayViewModel(data));
    }
}

-------------------------------------------

文章目录(未完,待续):

一:android 应用子功能及移动框架总述 https://blog.csdn.net/cbk861110/article/details/86665564

二:android 高德天气API说明及城市天气查询实现 https://blog.csdn.net/cbk861110/article/details/86665655

三:android 自定义控件实现(ActionBar + PageIndicatorView) https://blog.csdn.net/cbk861110/article/details/86665790

四:android ViewPager实现左右页面滑动切换 https://blog.csdn.net/cbk861110/article/details/86665964

五:android应用权限动态申请 https://blog.csdn.net/cbk861110/article/details/86666321

六:android RecyclerView 封装及使用 https://blog.csdn.net/cbk861110/article/details/86666392

七:android Xutils3文件下载实现(高德天气城市配置) https://blog.csdn.net/cbk861110/article/details/86666573

八:android DiskLruCache 磁盘缓存 封装和使用 https://blog.csdn.net/cbk861110/article/details/86666664

九:android ThreadPoolExecutor线程池 封装及使用  https://blog.csdn.net/cbk861110/article/details/86667101

十:android 天气网络请求框架(retrofit2&okhttp3&Gson) 封装及使用  https://blog.csdn.net/cbk861110/article/details/86667375

十一:android RxAndroid(响应式编程) 异步网络请求实现 https://blog.csdn.net/cbk861110/article/details/86669178

十二:android DataBinding 数据和UI双向绑定实现 https://blog.csdn.net/cbk861110/article/details/86669708

十三:android room数据库 天气数据读写实现 https://blog.csdn.net/cbk861110/article/details/86670354

十四:android LiveData 使用方法(实现城市天气自动刷新) https://blog.csdn.net/cbk861110/article/details/86670531

十五:android ViewModel 使用方法 https://blog.csdn.net/cbk861110/article/details/86670703

十六:android 集成友盟消息推送机制(U-Push) https://blog.csdn.net/cbk861110/article/details/86683849

-------------------------------------------

【版权说明】

1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564

2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

猜你喜欢

转载自blog.csdn.net/cbk861110/article/details/86666392