android122 zhihuibeijing 新闻中心NewsCenterPager加载网络数据实现

 新闻中心NewsCenterPager.java

package com.itheima.zhbj52.base.impl;
import java.util.ArrayList;
import android.app.Activity;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.itheima.zhbj52.MainActivity;
import com.itheima.zhbj52.R;
import com.itheima.zhbj52.base.BaseMenuDetailPager;
import com.itheima.zhbj52.base.BasePager;
import com.itheima.zhbj52.base.menudetail.InteractMenuDetailPager;
import com.itheima.zhbj52.base.menudetail.NewsMenuDetailPager;
import com.itheima.zhbj52.base.menudetail.PhotoMenuDetailPager;
import com.itheima.zhbj52.base.menudetail.TopicMenuDetailPager;
import com.itheima.zhbj52.domain.NewsData;
import com.itheima.zhbj52.domain.NewsData.NewsMenuData;
import com.itheima.zhbj52.fragment.LeftMenuFragment;
import com.itheima.zhbj52.global.GlobalContants;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;

/**
 * 新闻中心(前面可知,5个RadioButton所控制的ViewPager的xml类是NewsCenterPager的属性mRootView,
 * 这个类是用来给ViewPager的xml来填充xml数据的)
 */
public class NewsCenterPager extends BasePager {
    /*从BasePager继承的属性:(这个类的作用就是修改tvTitle,flContent,btnMenu的值)
        public View mRootView = View.inflate(mActivity, R.layout.base_pager, null);//这个mRootView是5个RadioButton所控制的ViewPager的xml类。
        public TextView tvTitle = (TextView) mRootView.findViewById(R.id.tv_title);// 标题对象
        public FrameLayout flContent = (FrameLayout) mRootView.findViewById(R.id.fl_content);// 下面的空布局 
        public ImageButton btnMenu = (ImageButton) mRootView.findViewById(R.id.btn_menu);// 三条红色的横线
    */
    private ArrayList<BaseMenuDetailPager> mPagers;// 4个菜单详情页的集合
    private NewsData mNewsData;

    public NewsCenterPager(Activity activity) {
        super(activity);
    }

    @Override
    public void initData() {
        System.out.println("初始化新闻中心数据....");
        tvTitle.setText("新闻");
        setSlidingMenuEnable(true);// 打开侧边栏可以滑动出来。
        getDataFromServer();
    }

    /**
     * 从服务器获取数据
     */
    private void getDataFromServer() {
        HttpUtils utils = new HttpUtils();

        // 使用xutils发送请求
        utils.send(HttpMethod.GET, GlobalContants.CATEGORIES_URL,
                new RequestCallBack<String>() {//这里返回的是json字符串所以传String,如果是下载文件就要传File,
                    // 访问成功
                    @Override
                    public void onSuccess(ResponseInfo responseInfo) {
                        String result = (String) responseInfo.result;
                        System.out.println("返回结果:" + result);
                        parseData(result);
                    }
                    // 访问失败
                    @Override
                    public void onFailure(HttpException error, String msg) {
                        Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
                                .show();
                        error.printStackTrace();
                    }
                });
    }

    /**
     * 解析网络数据
        ## Json ##
        {"name":"zhangsan", 
        "age":18, 
        "books":[ {"name":"wwww","price":10},  {"name":"wwww","price":20} ]
        }
        ## Gson ##
        google + json
        谷歌提供的开源的解析json的框架
        Gson gson = new Gson();
        NewsData data = gson.fromJson(result, NewsData.class);
     */
    protected void parseData(String result) {
        Gson gson = new Gson();
        mNewsData = gson.fromJson(result, NewsData.class);//Gson将json解析成NewsData对象,Gson也可以将对象转成json,
        System.out.println("解析结果:" + mNewsData);

        // 刷新测边栏的数据(新闻中心RadioButton的侧边栏“新闻,专题,组图,互动”),侧边栏是根据主页面的不同而不同的。
        MainActivity mainUi = (MainActivity) mActivity;//MainActivity
        LeftMenuFragment leftMenuFragment = mainUi.getLeftMenuFragment();//getLeftMenuFragment()是MainActivity的方法,
        leftMenuFragment.setMenuData(mNewsData);

        // 准备4个菜单详情页(下面其中之一"新闻中心"RadioButton点进去后的左侧栏的"新闻,专题,组图,互动页面"的右侧详情页面。)
        mPagers = new ArrayList<BaseMenuDetailPager>();
        mPagers.add(new NewsMenuDetailPager(mActivity, mNewsData.data.get(0).children));//新闻中心-新闻
        mPagers.add(new TopicMenuDetailPager(mActivity));//新闻中心-专题
        mPagers.add(new PhotoMenuDetailPager(mActivity));//新闻中心-组图
        
        /*  BaseMenuDetailPager.java
            public abstract class BaseMenuDetailPager {
                public Activity mActivity;
                public View mRootView;// 根布局对象
                public BaseMenuDetailPager(Activity activity) {
                    mActivity = activity;
                    mRootView = initViews();
                }
                public abstract View initViews();
                public void initData() {
                }
            }
           PhotoMenuDetailPager.java
           public class PhotoMenuDetailPager extends BaseMenuDetailPager {
            public PhotoMenuDetailPager(Activity activity) {
                super(activity);
            }
            @Override
            public View initViews() {
                TextView text = new TextView(mActivity);
                text.setText("菜单详情页-组图");
                text.setTextColor(Color.RED);
                text.setTextSize(25);
                text.setGravity(Gravity.CENTER);
                return text;
            }
        }*/
        mPagers.add(new InteractMenuDetailPager(mActivity));//新闻中心-互动

        setCurrentMenuDetailPager(0);// 设置菜单详情页-新闻为默认当前页
    }

    /**
     * 设置当前菜单详情页(修改5个RadioButton对应的ViewPager的xml数据)
     */
    public void setCurrentMenuDetailPager(int position) {
        BaseMenuDetailPager pager = mPagers.get(position);// 获取当前要显示的菜单详情页
        flContent.removeAllViews();// 清除之前的布局,flContent是BasePager的FrameLayout flContent属性,也是ViewPager的其中之一xml的FrameLayout(ViewPager的xml布局不一定要一样)。
        flContent.addView(pager.mRootView);// 将菜单详情页的布局设置给帧布局,返回的是包含ViewPager控件的xml对应的View对象。View mRootView=View.inflate(mActivity, R.layout.news_menu_detail, null),news_menu_detail.xml是一个包含ViewPager的xml。或者仅仅返回一个View对象就可以。flContent是一个FrameLayout,里面加载的xml是新闻中心类的一个View属性,对该View属性的控制是在该类中完成的。

        // 设置当前页的标题
        NewsMenuData menuData = mNewsData.data.get(position);
        tvTitle.setText(menuData.title);

        pager.initData();// 初始化当前页面的数据
    }

}

网络数据类NewsData.java

package com.itheima.zhbj52.domain;

import java.util.ArrayList;

/**
 * 网络分类信息的封装
 */
public class NewsData {
    //gson解析的时候retcode,data字段名字必须和服务器返回的json字段名一致,
    public int retcode;
    public ArrayList<NewsMenuData> data;

    // 侧边栏数据对象
    public class NewsMenuData {
        //gson解析的时候id,title,type,url字段名字必须和服务器返回的字段名一致,
        public String id;
        public String title;
        public int type;
        public String url;
        public ArrayList<NewsTabData> children;
        @Override
        public String toString() {
            return "NewsMenuData [title=" + title + ", children=" + children
                    + "]";
        }
    }

    // 新闻页面下11个子页签的数据对象
    public class NewsTabData {
        //gson解析的时候id,title,type,url字段名字必须和服务器返回的json字段名一致,
        public String id;
        public String title;
        public int type;
        public String url;
        @Override
        public String toString() {
            return "NewsTabData [title=" + title + "]";
        }
    }

    @Override
    public String toString() {
        return "NewsData [data=" + data + "]";
    }
}

侧边栏(新闻中心RadioButton的侧边栏“新闻,专题,组图,互动”)  LeftMenuFragment.java

package com.itheima.zhbj52.fragment;

import java.util.ArrayList;

import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.itheima.zhbj52.MainActivity;
import com.itheima.zhbj52.R;
import com.itheima.zhbj52.base.impl.NewsCenterPager;
import com.itheima.zhbj52.domain.NewsData;
import com.itheima.zhbj52.domain.NewsData.NewsMenuData;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;

/**
 * 侧边栏(新闻中心RadioButton的侧边栏“新闻,专题,组图,互动”)
 */
public class LeftMenuFragment extends BaseFragment {

    @ViewInject(R.id.lv_list)
    private ListView lvList;
    private ArrayList<NewsMenuData> mMenuList;

    private int mCurrentPos;// 当前被点击的菜单项
    private MenuAdapter mAdapter;

    @Override
    public View initViews() {
        View view = View.inflate(mActivity, R.layout.fragment_left_menu, null);
        //fragment_left_menu.xml
        /*<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#000" >
        侧边栏是一个List
            <ListView
                android:id="@+id/lv_list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:listSelector="@android:color/transparent"
                android:divider="@android:color/transparent"     listView的分割线为透明
                android:layout_marginTop="40dp" />
       </RelativeLayout>*/
        ViewUtils.inject(this, view);//写这一句就支持注解了。
        return view;
    }

    @Override
    public void initData() {//BaseFragment里面调用
        lvList.setOnItemClickListener(new OnItemClickListener() {//ItemClick事件里面可以获取当前点击哪一个。
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                mCurrentPos = position;
                mAdapter.notifyDataSetChanged();//调用Adapter的getView()方法,这时getView()方法执行的次数为listView的个数,从而设置是否显示红色和白色。
                                                //getView()方法不仅仅是在初始化和滑动的时候调用,在其他需要的地方也可以调用。

                setCurrentMenuDetailPager(position);

                toggleSlidingMenu();// 隐藏
            }
        });
    }

    /**
     * 切换SlidingMenu的状态,侧边栏隐藏和显示。
     */
    protected void toggleSlidingMenu() {
        MainActivity mainUi = (MainActivity) mActivity;
        SlidingMenu slidingMenu = mainUi.getSlidingMenu();
        slidingMenu.toggle();// 切换状态, 显示时隐藏, 隐藏时显示
    }

    /**
     * 设置当前菜单详情页,onItemClick触发。
     */
    protected void setCurrentMenuDetailPager(int position) {
        MainActivity mainUi = (MainActivity) mActivity;
        ContentFragment fragment = mainUi.getContentFragment();// 获取主页面fragment
        NewsCenterPager pager = fragment.getNewsCenterPager();// 获取新闻中心页面
        pager.setCurrentMenuDetailPager(position);// 设置当前菜单详情页,新闻中心左边侧边栏点击后右边主页面显示不同的分类。
    }

    // 设置网络数据
    public void setMenuData(NewsData data) {
        // System.out.println("侧边栏拿到数据啦:" + data);
        mMenuList = data.data;
        mAdapter = new MenuAdapter();
        lvList.setAdapter(mAdapter);
    }

    /**
     * 侧边栏数据适配器
     */
    class MenuAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return mMenuList.size();
        }

        @Override
        public NewsMenuData getItem(int position) {
            return mMenuList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = View.inflate(mActivity, R.layout.list_menu_item, null);
            //list_menu_item.xml
            /*<?xml version="1.0" encoding="utf-8"?>
            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="10dp" >
                <TextView
                    android:id="@+id/tv_title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:drawableLeft="@drawable/btn_menu_selector"   新闻左边的小三角形图片选择器
                    android:drawablePadding="5dp"
                    android:enabled="false"    默认不可使用,
                    android:text="新闻"
                    android:textColor="@drawable/text_menu_selector"   文字的颜色选择器
                    android:textSize="25sp" />
            </LinearLayout>
            
            btn_menu_selector选择器:
                <?xml version="1.0" encoding="utf-8"?>
                <selector xmlns:android="http://schemas.android.com/apk/res/android">
                    <item android:state_enabled="true" android:drawable="@drawable/menu_arr_select"/>   可以使用就是红色,
                    <item android:drawable="@drawable/menu_arr_normal"/>    不可以使用就是白色,
                </selector>
            */
            TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
            NewsMenuData newsMenuData = getItem(position);
            tvTitle.setText(newsMenuData.title);

            if (mCurrentPos == position) {// 判断当前绘制的view是否被选中
                // 显示红色
                tvTitle.setEnabled(true);//可以使用,然后根据颜色选择器判断显示的颜色。
            } else {
                // 显示白色
                tvTitle.setEnabled(false);
            }
            return view;
        }
    }
}

侧边栏“新闻”  NewsMenuDetailPager.java

package com.itheima.zhbj52.base.menudetail;

import java.util.ArrayList;

import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.itheima.zhbj52.R;
import com.itheima.zhbj52.base.BaseMenuDetailPager;
import com.itheima.zhbj52.base.TabDetailPager;
import com.itheima.zhbj52.domain.NewsData.NewsTabData;

/**
 * 菜单详情页-新闻
 */
public class NewsMenuDetailPager extends BaseMenuDetailPager {
    //BaseMenuDetailPager.java
    /*public abstract class BaseMenuDetailPager {
        public Activity mActivity;
        public View mRootView;// 根布局对象
        public BaseMenuDetailPager(Activity activity) {
            mActivity = activity;
            mRootView = initViews();
        }
        public abstract View initViews();
        public void initData() {
        }
    }*/
    /*继承的属性:
        public View mRootView = initViews();
    */
    private ViewPager mViewPager;

    private ArrayList<TabDetailPager> mPagerList;

    private ArrayList<NewsTabData> mNewsTabData;// 页签网络数据,北京,中国,国际,体育等11个页面

    public NewsMenuDetailPager(Activity activity,ArrayList<NewsTabData> children) {
        super(activity);
        mNewsTabData = children;
    }

    @Override
    public View initViews() {
        View view = View.inflate(mActivity, R.layout.news_menu_detail, null);
        //news_menu_detail.xml
        /*
        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >
            <android.support.v4.view.ViewPager
                android:id="@+id/vp_menu_detail"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>
        */
        mViewPager = (ViewPager) view.findViewById(R.id.vp_menu_detail);//修改view这个xml对象的属性
        return view;
    }

    @Override
    public void initData() {
        mPagerList = new ArrayList<TabDetailPager>();

        // 初始化页签数据(11个TabDetailPager是 北京,中国,国际,体育等页面)
        for (int i = 0; i < mNewsTabData.size(); i++) {
            TabDetailPager pager = new TabDetailPager(mActivity, mNewsTabData.get(i));
            mPagerList.add(pager);
        }

        mViewPager.setAdapter(new MenuDetailAdapter());
    }

    class MenuDetailAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            return mPagerList.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            TabDetailPager pager = mPagerList.get(position);//页签数据11个TabDetailPager
            container.addView(pager.mRootView);//mRootView=new TextView(mActivity),这里返回一个XMl的View对象。
            pager.initData();//这里对XML的View对象进行数据的加载。
            return pager.mRootView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }

}

页签详情页 TabDetailPager.java

package com.itheima.zhbj52.base;

import com.itheima.zhbj52.domain.NewsData.NewsTabData;

import android.app.Activity;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;

/**
 * 页签详情页
 */
public class TabDetailPager extends BaseMenuDetailPager {
    /*public abstract class BaseMenuDetailPager {
        public Activity mActivity;
        public View mRootView;// 根布局对象,返回给上层ViewPager的xml的View对象。
        public BaseMenuDetailPager(Activity activity) {
            mActivity = activity;
            mRootView = initViews();
        }
        public abstract View initViews();
        public void initData() {
        }
    }*/
    NewsTabData mTabData;
    private TextView tvText;

    public TabDetailPager(Activity activity, NewsTabData newsTabData) {
        super(activity);
        mTabData = newsTabData;
    }

    @Override
    public View initViews() {
        tvText = new TextView(mActivity);
        tvText.setText("页签详情页");
        tvText.setTextColor(Color.RED);
        tvText.setTextSize(25);
        tvText.setGravity(Gravity.CENTER);
        return tvText;//返回给上层的XML的View对象
    }

    @Override
    public void initData() {//对返回给上层的XML的VIew对象的数据的加载
        tvText.setText(mTabData.title);
    }

}
原文地址:https://www.cnblogs.com/yaowen/p/5042683.html