在应用层调用OKhttp进行数据请求,更新View

    当封装好了OKhttpSDK网络请求组件的时候,就需要在应用层进行调用来更新View,先在应用层写一个调用接口,随后直接调用实现功能逻辑即可。
/**
 * @function 应用层的封装,存放所有的请求接口
 * @author chao
 */

public class RequestCenter {

    //没有任何的业务逻辑,只是为了方便调用
    public static void PostRequest (String url, RequestParams params, DisposeDataListener listener, Class<?>clazz){
        CommonOkhttpClient.get(CommonRequest.CreateGetRequest(url, params),new DisposeDataHandle(listener, clazz));
    }

    //首页网络请求的接口
    public static void RequestRecommanData (DisposeDataListener listener){
        RequestCenter.PostRequest(HttpConstants.HOME_RECOMMAND,null,listener,BaseRecommandModel.class);
    }

}
1:在Fragment文件中实现调用OKhttp接口,进行相关界面的渲染功能。
/**
     * 发送首页列表数据请求
     */
    private void requestRecommandData() {
        RequestCenter.RequestRecommanData(new DisposeDataListener() {
            @Override
            public void onSuccess(Object responseObj) {
                //完成更能逻辑,获取数据,更新View   获取数据
                mRecommandData = (BaseRecommandModel) responseObj;
                //更新UI
                showSuccessView();
            }

            @Override
            public void onFailure(Object reasonObj) {
                //数据加载失败
                showErrorView();
            }

            /**
             * 请求成功调用
             */
            private void showSuccessView() {
                //判断数据为空&&大小大于0
                if (mRecommandData.data.list != null && mRecommandData.data.list.size()>0) {
                    //更新UI
                    loading_view.setVisibility(View.GONE);
                    list_view.setVisibility(View.VISIBLE);
                    //新建adapter适配器
                    mAdapter = new CourseAdapter(mContext,mRecommandData.data.list);
                    list_view.setAdapter(mAdapter);
                } else {
                    //请求失败
                    showErrorView();
                }
            }

            /**
             * 请求失败调用
             */
            private void showErrorView() {

            }
        });
    }
2:接下开根据判断结果,失败返回失败原因,成功执行更新UI; 新建一个CourseAdapter适配器,在里面实现更新的相关逻辑。(具体步骤就不一一写了,代码中有详细的注释)
/**
 * @author chao
 * @function listView中各种不同item的适配器
 */

public class CourseAdapter extends BaseAdapter {

    /**
     * listview中不同的item标识
     */
    private static final int card_count = 4;
    private static final int video_type = 0x01;
    private static final int cade_single_pic = 0x02;
    private static final int cade_figure_pic = 0x03;
    private static final int cade_pager_pic = 0x04;

    private Context mContext;
    private ViewHolder mViewHolder;
    private LayoutInflater mInflate;
    private ArrayList<RecommandBodyValue> mData;
    private ImageLoaderManager mImagerLoader;

    // 构造方法,接收对应的参数 初始化控件
    public CourseAdapter(Activity Context, ArrayList<RecommandBodyValue> list) {
        mContext = Context;
        mData = list;
        mInflate = LayoutInflater.from(mContext);
        mImagerLoader = ImageLoaderManager.getInstance(mContext);
    }
    //返回列表item的总数
    @Override
    public int getCount() {
        return mData.size();
    }
    //返回列表item的每一项的数据
    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
    //返回listView中所有的item类型
    @Override
    public int getViewTypeCount() {
        return card_count;
    }
    //返回每列数据所对应的item类型
    @Override
    public int getItemViewType(int position) {
        RecommandBodyValue value = (RecommandBodyValue) getItem(position);
        return value.type;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //获取数据的type类型
        int type = getItemViewType(position);
        //获取对应列表数据
        final RecommandBodyValue value = (RecommandBodyValue) getItem(position);

        //创建View 判断缓存view是否为空
        if (convertView == null){
            //新建View
            switch (type){
                case cade_single_pic :
                    mViewHolder = new ViewHolder();
                    convertView = mInflate.inflate(R.layout.item_single_layout,parent,false);
                    //初始化单图Viewholder中所有的控件
                    mViewHolder.mLogoView = (CircleImageView) convertView.findViewById(R.id.item_logo_view);
                    mViewHolder.mTitleView = (TextView) convertView.findViewById(R.id.item_title_view);
                    mViewHolder.mPriceView = (TextView) convertView.findViewById(R.id.item_price_view);
                    mViewHolder.mInfoView = (TextView) convertView.findViewById(R.id.item_info_view);
                    mViewHolder.mFooterView = (TextView) convertView.findViewById(R.id.item_footer_view);
                    mViewHolder.mFromView = (TextView) convertView.findViewById(R.id.item_from_view);
                    mViewHolder.mZanView = (TextView) convertView.findViewById(R.id.item_zan_view);
                    mViewHolder.mProductLayout = (LinearLayout) convertView.findViewById(R.id.product_photo_view);
                    break;
                case cade_figure_pic :
                    mViewHolder = new ViewHolder();
                    convertView = mInflate.inflate(R.layout.item_figure_layout,parent,false);
                    //初始化多图Viewholder中所有的控件
                    mViewHolder.mLogoView = (CircleImageView) convertView.findViewById(R.id.item_logo_view);
                    mViewHolder.mTitleView = (TextView) convertView.findViewById(R.id.item_title_view);
                    mViewHolder.mPriceView = (TextView) convertView.findViewById(R.id.item_price_view);
                    mViewHolder.mInfoView = (TextView) convertView.findViewById(R.id.item_info_view);
                    mViewHolder.mFooterView = (TextView) convertView.findViewById(R.id.item_footer_view);
                    mViewHolder.mFromView = (TextView) convertView.findViewById(R.id.item_from_view);
                    mViewHolder.mZanView = (TextView) convertView.findViewById(R.id.item_zan_view);
                    mViewHolder.mProductLayout = (LinearLayout) convertView.findViewById(R.id.product_photo_layout);
                    break;
                case cade_pager_pic :
                    mViewHolder = new ViewHolder();
                    convertView = mInflate.inflate(R.layout.item_pager_layout, null, false);
                    //初始化Viewpager中所有的控件
                    mViewHolder.mViewPager = convertView.findViewById(R.id.pager);
                    mViewHolder.mViewPager.setPageMargin(utils.dip2px(mContext, 12));
                    //为ViewPager填充数据
                    ArrayList<RecommandBodyValue> recommandList = com.yongninggo.newapp.OKhttp.Util.handleData(value);
                    mViewHolder.mViewPager.setAdapter(new HotSalePagerAdapter(mContext, recommandList));
                    mViewHolder.mViewPager.setCurrentItem(recommandList.size() * 100);
                    break;
                default:
                    break;
            }
            convertView.setTag(mViewHolder);
        } else {
            //表示有可用的ConvertView
            mViewHolder = (ViewHolder) convertView.getTag();
        }

        //开始绑定数据
        switch (type){
            case cade_single_pic :
                mViewHolder.mTitleView.setText(value.title);
                mViewHolder.mPriceView.setText(value.price);
                mViewHolder.mInfoView.setText(value.info.concat(mContext.getString(R.string.tianqian)));
                mViewHolder.mFooterView.setText(value.text);
                mViewHolder.mFromView.setText(value.from);
                mViewHolder.mZanView.setText(mContext.getString(R.string.dian_zan).concat(value.zan));

                //为imageView实现异步图片加载功能
                mImagerLoader.display(mViewHolder.mLogoView,value.logo);
                mImagerLoader.display(mViewHolder.mProductView,value.url.get(0));
                break;
            case cade_figure_pic :
                mViewHolder.mTitleView.setText(value.title);
                mViewHolder.mPriceView.setText(value.price);
                mViewHolder.mInfoView.setText(value.info.concat(mContext.getString(R.string.tianqian)));
                mViewHolder.mFooterView.setText(value.text);
                mViewHolder.mFromView.setText(value.from);
                mViewHolder.mZanView.setText(mContext.getString(R.string.dian_zan).concat(value.zan));

                mImagerLoader.display(mViewHolder.mLogoView,value.logo);
                mViewHolder.mProductLayout.removeAllViews();//删除已有的图片
                //动态的添加imageview到ScrollView中
                for (String url : value.url) {
                    mViewHolder.mProductLayout.addView(createImageView(url));
                }

                break;
            case cade_pager_pic :

                break;
            default:
                break;
        }
        return convertView;
    }

    /**
     * 动态的创建imageView
     * @return
     */
    private ImageView createImageView (String url){
        ImageView imageView = new ImageView(mContext);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(utils.dip2px(mContext,100),LinearLayout.LayoutParams.MATCH_PARENT);
        params.leftMargin = utils.dip2px(mContext,5);
        imageView.setLayoutParams(params);
        mImagerLoader.display(imageView,url);
        return imageView;
    }

    /**
     * 缓存已经创建好的item
     */
    private static class ViewHolder {
        //所有Card共有属性
        private CircleImageView mLogoView;
        private TextView mTitleView;
        private TextView mInfoView;
        private TextView mFooterView;
        //Video Card特有属性
        private RelativeLayout mVieoContentLayout;
        private ImageView mShareView;

        //Video Card外所有Card具有属性
        private TextView mPriceView;
        private TextView mFromView;
        private TextView mZanView;
        //Card One特有属性
        private LinearLayout mProductLayout;
        //Card Two特有属性
        private ImageView mProductView;
        //Card Three特有属性
        private View mViewPager;
    }
}
还有一个就是头部添加图片轮播功能,可以自己制作,也可以依赖一个图片轮播的框架来进行开发。

只需要在请求成功的地方添加listView。

mListView.addHeaderView(new “类名”(mContext, mRecommandData.data.head));
大概的思路就是这样,基本就可以实现利用网络框架进行界面渲染了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值