package com.sqh.market.fragments; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.support.v4.widget.SwipeRefreshLayout; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.SearchView; import android.widget.Toast; import com.alibaba.fastjson.JSON; import com.sqh.market.R; import com.sqh.market.activity.DetailsActivity; import com.sqh.market.activity.SearchViewActivity; import com.sqh.market.adapter.GlideImageLoader; import com.sqh.market.adapter.HomePageGridViewAdapter; import com.sqh.market.adapter.HomePageViewPagerAdapter; import com.sqh.market.adapter.HotGridViewAdapter; import com.sqh.market.adapter.RecommendGridViewAdapter; import com.sqh.market.constant.Constants; import com.sqh.market.models.CommodityModel; import com.sqh.market.models.CommodityTypeModel; import com.sqh.market.utils.ListUtil; import com.sqh.market.utils.NetUtil; import com.youth.banner.Banner; import com.youth.banner.BannerConfig; import java.io.IOException; import java.util.ArrayList; import java.util.List; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; /** * 首页 * * @author 郑龙 */ public class HomePage extends Fragment { /** * 轮播 */ private Banner banner; /** * GridView小圆点指示器 */ private ViewGroup points; /** * 小圆点指示器图片集合 */ private ImageView[] ivPoints; /** * viewPager */ private ViewPager viewPager; /** * 总的页数 */ private int totalPage = 0; /** * 每页显示的最大数量 */ private int mPageSize = 10; /** * 商品数据源 */ private List<CommodityTypeModel> listData = new ArrayList<>(); /** * GridView作为一个View对象添加到ViewPager集合中 */ private List<View> viewPagerList; /** * 热评产品 */ private GridView hotProductGridView; /** * 推荐产品 */ private GridView recommendProductGridView; /** * 热评和推荐商品的两个进度条 */ private ProgressBar hotProgressBar, recommendProgressBar; private HotGridViewAdapter hotProductGridViewAdapter; private RecommendGridViewAdapter recommendProductGridViewAdapter; private SearchView searchView; private ArrayList<String> imageList = new ArrayList<>(); /** * 一次请求到分页商品数据 */ private List<CommodityModel> listItem = new ArrayList<>(); /** * 热评商品List */ private List<CommodityModel> listItemHot = new ArrayList<>(); /** * 推荐商品List */ private List<CommodityModel> listItemRecommend = new ArrayList<>(); /** * 下拉刷新的layout */ private SwipeRefreshLayout mRefreshLayout; /** * 为了刷新不增加小点增加的记录的变量 */ private int firstFlag = 0; /** * 定义一个自己的context */ private Context mContext; /** * 用于从网络初始化UI的handler */ private Handler uiHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case -1: //网络请求失败 Toast.makeText(mContext, "网络请求失败!获取商品类别失败!", Toast.LENGTH_SHORT).show(); break; case 0: //网络请求成功,但是返回状态为失败 Toast.makeText(mContext, msg.obj == null ? "获取商品数据失败!" : msg.obj.toString(), Toast.LENGTH_SHORT).show(); break; case 1: //网络请求商品类别返回成功时,初始化控件 initViewPage(); break; case 2: //随机两款商品作为热销商品 listItemHot = ListUtil.getRandomList(listItem, 2); //模拟获取热评商品 hotProductGridViewAdapter = new HotGridViewAdapter(HomePage.this.getContext(), listItemHot); hotProductGridView.setAdapter(hotProductGridViewAdapter); //设置gridview点击事件 hotProductGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(getActivity(), DetailsActivity.class); //将对应的产品id传到详情界面 intent.putExtra("id", listItemHot.get(position).getId() + ""); startActivity(intent); } }); //停止显示热评商品加载动画,显示商品信息 hotProgressBar.setVisibility(View.GONE); hotProductGridView.setVisibility(View.VISIBLE); //随机两款商品作为热销商品 listItemRecommend = ListUtil.getRandomList(listItem, 2); //模拟获取推荐商品 recommendProductGridViewAdapter = new RecommendGridViewAdapter(HomePage.this.getContext(), listItemRecommend); recommendProductGridView.setAdapter(recommendProductGridViewAdapter); //设置gridView点击事件 recommendProductGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(getActivity(), DetailsActivity.class); //将对应的产品id传到详情界面 intent.putExtra("id", listItemRecommend.get(position).getId() + ""); startActivity(intent); } }); //停止显示热评商品加载动画,显示商品信息 recommendProgressBar.setVisibility(View.GONE); recommendProductGridView.setVisibility(View.VISIBLE); break; default: break; } //判断刷新动画 if (mRefreshLayout.isRefreshing()) { //停止动画 mRefreshLayout.setRefreshing(false); } } }; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_homepage, null); // 初始化控件 initView(view); //转存context mContext = getActivity().getApplicationContext(); //判断网络状态,并初始化数据 if (NetUtil.isNetworkAvailable(getContext())) { //获取分类 initCategoryClassification(); //加载轮播图 initBanner(); //获取热评商品 initCommodityList(Constants.HOME_PAGE_LIMIT, 0, true); } else { // TODO: 2019/3/21 这里会弹出一个框,提示网络不正常! Toast.makeText(getActivity().getApplicationContext() , "当前网络环境不正常,商品 信息可能无法显示" , Toast.LENGTH_LONG).show(); } //设置searchView点击事件 setSearchViewIntent(); // 刷新监听。 mRefreshLayout.setOnRefreshListener(mRefreshListener); return view; } /** * 初始化广告页 */ private void initBanner() { //清空旧数据 imageList.clear(); imageList.add(Constants.BASE_ADS_URL + Constants.ADS.ADS_URL1.getUrl()); imageList.add(Constants.BASE_ADS_URL + Constants.ADS.ADS_URL2.getUrl()); banner.setImages(imageList); banner.start(); } /** * 刷新 */ private SwipeRefreshLayout.OnRefreshListener mRefreshListener = new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //获取分类 initCategoryClassification(); //加载轮播图 initBanner(); //获取商品分页数据 initCommodityList(Constants.HOME_PAGE_LIMIT, 0, true); } }; /** * 获取商品分页数据 * * @param limit 拉取数据条数(首页建议为6) * @param page 页码 * @param isRandomPage 是否采用随机页码 */ private void initCommodityList(int limit, int page, boolean isRandomPage) { //初始化随机页码 int randomPage = (int) (Math.random() * (Constants.MAX - Constants.MIN)) + Constants.MIN; //构造请求URL String url = Constants.BASE_URL + Constants.GET_COMMODITY_URL + "?limit=" + limit; //判断是否需要随机生成页码 if (isRandomPage) { url += "&page=" + randomPage; } else { url += "&page=" + page; } NetUtil.doGet(url, new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e("TAG", "错误信息:" + e.toString()); Message message = Message.obtain(); message.what = -1; uiHandler.sendMessage(message); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string().trim(); com.alibaba.fastjson.JSONObject object = JSON.parseObject(result); Message message = Message.obtain(); if (object.getBoolean("flag")) { com.alibaba.fastjson.JSONObject data = (com.alibaba.fastjson.JSONObject) object.get("data"); com.alibaba.fastjson.JSONArray array = data.getJSONArray("lists"); //获得商品list listItem = com.alibaba.fastjson .JSONArray.parseArray(array.toString(), CommodityModel.class); message.what = 2; } else { message.what = 0; } uiHandler.sendMessage(message); } } ); } /** * 初始化GridView */ private void initViewPage() { LayoutInflater inflater2 = LayoutInflater.from(this.getContext()); //总的页数,取整(这里有三种类型:Math.ceil(3.5)=4:向上取整,只要有小数都+1 Math.floor(3.5)=3:向下取整 Math.round(3.5)=4:四舍五入) //这个被tjs改过 //if(totalPage>0){ totalPage = (int) Math.ceil(listData.size() * 1.0 / mPageSize); //} viewPagerList = new ArrayList<>(); for (int i = 0; i < totalPage; i++) { //每个页面都是inflate出一个新实例 GridView gridView = (GridView) inflater2.inflate(R.layout.gridview_layout, viewPager, false); gridView.setAdapter(new HomePageGridViewAdapter(this.getContext(), listData, i, mPageSize)); //每一个GridView作为一个View对象添加到ViewPager集合中 viewPagerList.add(gridView); } //设置ViewPager适配器 viewPager.setAdapter(new HomePageViewPagerAdapter(viewPagerList)); //小圆点指示器 if (firstFlag == 0) { ivPoints = new ImageView[totalPage]; for (int i = 0; i < ivPoints.length; i++) { ImageView imageView = new ImageView(getContext()); //设置图片的宽高 imageView.setLayoutParams(new ViewGroup.LayoutParams(10, 10)); if (i == 0) { imageView.setBackgroundResource(R.drawable.page__selected_indicator); } else { imageView.setBackgroundResource(R.drawable.page__normal_indicator); } ivPoints[i] = imageView; LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); layoutParams.leftMargin = 10;//设置点点点view的左边距 layoutParams.rightMargin = 10;//设置点点点view的右边距 points.addView(imageView, layoutParams); } } if (totalPage > 0) { firstFlag++; } //设置ViewPager滑动监听 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //改变小圆圈指示器的切换效果 setImageBackground(position); // currentPage = position; } @Override public void onPageScrollStateChanged(int state) { } }); } /** * 初始化获取商品分类 */ private void initCategoryClassification() { String categoryTypeUrl = Constants.BASE_URL + Constants.GET_COMMODITY_TYPES_URL; NetUtil.doGet(categoryTypeUrl, new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e("网络请求失败!", "网络请求失败!获取商品类别列表失败!"); Message message = Message.obtain(); message.what = -1; uiHandler.sendMessage(message); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string().trim(); com.alibaba.fastjson.JSONObject obj = JSON.parseObject(result); Message message = Message.obtain(); if (obj.getBoolean("flag")) { message.what = 1; //获得商品类型数据 List<CommodityTypeModel> types = com.alibaba.fastjson.JSONArray .parseArray(JSON.toJSONString(obj.get("data")) , CommodityTypeModel.class); listData = types; } else { message.what = 0; } message.obj = obj.getString("message"); uiHandler.sendMessage(message); } }); } /** * 初始化绑定控件 * * @param view view */ public void initView(View view) { mRefreshLayout = view.findViewById(R.id.refresh_layout); viewPager = view.findViewById(R.id.viewPager); //初始化小圆点指示器 points = view.findViewById(R.id.points); //绑定两个进度条 hotProgressBar = view.findViewById(R.id.hot_progress); recommendProgressBar = view.findViewById(R.id.recommend_progress); banner = view.findViewById(R.id.banner); //设置banner样式 banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR); //设置图片加载器 banner.setImageLoader(new GlideImageLoader()); hotProductGridView = view.findViewById(R.id.hot_gridview); recommendProductGridView = view.findViewById(R.id.recommend_gridview); searchView = view.findViewById(R.id.home_serachview); } /** * searchView点击跳转 */ private void setSearchViewIntent() { searchView.setFocusable(false); searchView.clearFocus(); //设置搜索框焦点 searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) searchView.clearFocus(); else { Intent intent = new Intent(getActivity(), SearchViewActivity.class); intent.putExtra("fatherName", ".HomePage"); startActivityForResult(intent, 1); } } }); } /** * 设置GridView图片背景 * * @param selectItems 选中项index */ private void setImageBackground(int selectItems) { for (int i = 0; i < ivPoints.length; i++) { if (i == selectItems) { ivPoints[i].setBackgroundResource(R.drawable.page__selected_indicator); } else { ivPoints[i].setBackgroundResource(R.drawable.page__normal_indicator); } } } }