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) { } }
2.轮播图的adapter
public class BannerAdapter extends PagerAdapter { private List<ImageView> imageViewList; public BannerAdapter(List<ImageView> imageViewList) { this.imageViewList = imageViewList; } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { ImageView imageView = imageViewList.get(position % imageViewList.size()); ViewGroup viewGroup = (ViewGroup) imageView.getParent(); if (viewGroup != null) { viewGroup.removeAllViews(); } container.addView(imageView); return imageView; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); } }