package cn.zhaoliang5156.zhaoliang2018727;
import android.Manifest;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import cn.zhaoliang5156.zhaoliang2018727.adapter.BannerAdapter;
import cn.zhaoliang5156.zhaoliang2018727.adapter.NewsListAdapter;
import cn.zhaoliang5156.zhaoliang2018727.bean.UIBannerBean;
import cn.zhaoliang5156.zhaoliang2018727.bean.UINewsBean;
import cn.zhaoliang5156.zhaoliang2018727.db.NewsBean;
import cn.zhaoliang5156.zhaoliang2018727.db.NewsDao;
import cn.zhaoliang5156.zhaoliang2018727.net.HttpUtils;
import cn.zhaoliang5156.zhaoliang2018727.net.NetUtils;
public class MainActivity extends AppCompatActivity implements HttpUtils.NetCallback {
private static final String TAG = MainActivity.class.getSimpleName();
private static final int CODE_BANNER = 1;
private static final long DELAY = 1000;
// api 相关
private String url = "http://ttpc.dftoutiao.com/jsonpc/refresh?type=";
private String bannerUrl = "http://www.xieast.com/api/banner.php";
private int type = 5010;
private PullToRefreshListView pullToRefreshListView;
// 数据库相关
private NewsDao newsDao;
// 网络请求相关
private HttpUtils httpUtils;
private List<UINewsBean.DataBean> dataBeanList;
private NewsListAdapter newsListAdapter;
// 轮播
private ViewPager viewPager;
private List<ImageView> bannerImages; // 轮播图片的集合
private LinearLayout llPonits;
private List<ImageView> ponits; // 小圆点的集合
private BannerCallback bannerCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 动态申请权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 200);
}
// 初始化PullToRefresh
pullToRefreshListView = findViewById(R.id.pull_to_refresh_listview);
pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
type = 5010;
loadData();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
type++;
loadData();
}
});
// 展示一个空的List
dataBeanList = new ArrayList<>();
newsListAdapter = new NewsListAdapter(this, dataBeanList);
pullToRefreshListView.setAdapter(newsListAdapter);
// 请求数据并在ListView中展示
// 先从数据库中读取, 数据库中有直接展示 没有判断网络是否连接 连接请求网络数据 没有连接提示提示用户没有网络
newsDao = new NewsDao(this);
httpUtils = HttpUtils.getInstance();
loadData();
bannerOperator();
}
/**
* 轮播操作
*/
private void bannerOperator() {
// 给PullToRefresh添加头布局
ListView refreshableView = pullToRefreshListView.getRefreshableView();
View bannerView = LayoutInflater.from(this).inflate(R.layout.banner_layout, null, false);
// 查找轮播视图
viewPager = bannerView.findViewById(R.id.view_pager);
llPonits = bannerView.findViewById(R.id.ll_points);
bannerImages = new ArrayList<>();
ponits = new ArrayList<>();
// 设置头布局的布局参数
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, 600);
bannerView.setLayoutParams(params);
// 添加头布局
refreshableView.addHeaderView(bannerView);
// 请求轮播
bannerCallback = new BannerCallback();
httpUtils.getDataFromServer(bannerUrl, bannerCallback);
}
class BannerCallback implements HttpUtils.NetCallback {
@Override
public void onSuccess(String result) {
Log.i(TAG, "轮播:" + result);
Gson gson = new Gson();
UIBannerBean uiBannerBean = gson.fromJson(result, UIBannerBean.class);
for (UIBannerBean.DataBean dataBean : uiBannerBean.getData()) {
// 添加图片
ImageView imageView = new ImageView(MainActivity.this);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
ImageLoader.getInstance().displayImage(dataBean.getImg(), imageView);
bannerImages.add(imageView);
// 添加小圆点
ImageView point = new ImageView(MainActivity.this);
point.setImageResource(R.drawable.point_normal);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(40, 40);
params.leftMargin = 10;
llPonits.addView(point, params);
ponits.add(point);
}
// 设置Adapter
viewPager.setAdapter(new BannerAdapter(bannerImages));
changePonintState(0);
mHandler.sendEmptyMessageDelayed(CODE_BANNER, DELAY);
}
@Override
public void onError(String errorMsg) {
}
}
private void changePonintState(int i) {
for (int j = 0; j < ponits.size(); j++) {
if (i == j) {
ponits.get(j).setImageResource(R.drawable.point_select);
} else {
ponits.get(j).setImageResource(R.drawable.point_normal);
}
}
}
// 轮播
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CODE_BANNER:
int currentItem = viewPager.getCurrentItem();
currentItem++;
viewPager.setCurrentItem(currentItem);
changePonintState(currentItem % ponits.size());
sendEmptyMessageDelayed(CODE_BANNER, DELAY);
break;
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
private void loadData() {
NewsBean load = newsDao.load(url + type);
if (load != null) {
// 读取json
showData(load.json);
} else {
// 判断网络
if (NetUtils.isNetConnect(this)) {
// 请求网络
httpUtils.getDataFromServer(url + type, this);
} else {
// 没有网络
Toast.makeText(this, "请连接网络!", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onSuccess(String result) {
Log.i(TAG, result);
// 数据包含null() 需要做字符串的替换
String json = result.replace("null(", "").replace(")", "");
Log.i(TAG, json);
// 存储到数据库
newsDao.replace(new NewsBean(url + type, json));
// 展示
showData(json);
}
/**
* 展示数据
*
* @param json
*/
private void showData(String json) {
Gson gson = new Gson();
UINewsBean uiNewsBean = gson.fromJson(json, UINewsBean.class);
/* 第一页数据 清空List */
if (type == 5010) {
dataBeanList.clear();
}
dataBeanList.addAll(uiNewsBean.getData());
// 使用HashSet去除重复
HashSet hashSet = new HashSet(dataBeanList);
dataBeanList.clear();
dataBeanList.addAll(hashSet);
// 刷新Adapter
newsListAdapter.notifyDataSetChanged();
// 停止刷新, 如果读取本地数据库 可能时间太快 停止不了刷新,所以延时1秒钟停止刷新
pullToRefreshListView.postDelayed(new Runnable() {
@Override
public void run() {
pullToRefreshListView.onRefreshComplete();
}
}, 1000);
}
@Override
public void onError(String errorMsg) {
}
}