一. Activity代码:
1. MainActivity.java
package week.three; import android.os.AsyncTask; 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.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import com.google.gson.Gson; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import adapter.MyBaseAdapter; import adapter.MyPagerAdapter; import bean.GoodsBean; public class MainActivity extends AppCompatActivity { private List<GoodsBean.DataBean.EssayBean> list = new ArrayList<>(); private MyPagerAdapter pagerAdapter; private MyBaseAdapter baseAdapter; private LinearLayout linearLayout; private List<ImageView> images; private ViewPager viewPager; private GridView gridView; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what == 0){ int currentItem = viewPager.getCurrentItem(); viewPager.setCurrentItem(currentItem+1); //持续延时发送消息 handler.sendEmptyMessageDelayed(0,2888); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //查找控件 linearLayout = (LinearLayout) findViewById(R.id.lineLayout); viewPager = (ViewPager) findViewById(R.id.viewPager); gridView = (GridView) findViewById(R.id.gridView); //解析数据 getData(); //轮播图延时发送空消息,展示在某一页面 viewPager.setCurrentItem(list.size()%100000); handler.sendEmptyMessageDelayed(0,2888); } //异步任务加载数据 public void getData() { AsyncTask<String,String,String> task = new AsyncTask<String, String, String>() { @Override protected String doInBackground(String... strings) { try { //解析数据的路径 String path = "http://v3.wufazhuce.com:8000/api/reading/index/?version=3.5.0&platform=android"; //连接网络,主页用HttpUrlConnection请求网络数据 URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); //响应数据 int responseCode = connection.getResponseCode(); if (responseCode == 200){ InputStream inputStream = connection.getInputStream(); //解析数据 String json = streamToString(inputStream,"utf-8"); return json; } } catch (Exception e) { e.printStackTrace(); } return ""; } @Override protected void onPostExecute(String json) { //解析json数据 GoodsBean goodsBean = new Gson().fromJson(json, GoodsBean.class); //调用设置适配器的方法,设置展示数据 if (goodsBean != null){ list.addAll(goodsBean.getData().getEssay()); // 初始化小圆点的方法 initCircle(); //设置适配器的方法 setAdapter(); } } }; task.execute(); } private void initCircle() { //首先需要一个集合记录这些小圆点的图片,,,,当页面切换的时候,可以从集合中取出imageView进行显示图片的设置 images = new ArrayList<>(); //再清除线性布局中的view视图 linearLayout.removeAllViews(); //遍历集合数据对应的圆点 for (int i = 0;i<list.size();i++){ //先初始化一个ImageView视图 ImageView imageview = new ImageView(MainActivity.this); //设置小圆点刚开始的颜色 if (i == 0){ imageview.setImageResource(R.drawable.shape_selected); }else { imageview.setImageResource(R.drawable.shape_select_no); } //把设置好的视图添加到集合中 images.add(imageview); //再把视图添加到线性布局中显示 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(5,0,5,0); linearLayout.addView(imageview,params); } } //设置适配器 public void setAdapter(){ //设置GridView格式展示数据的适配器 if (baseAdapter == null){ baseAdapter = new MyBaseAdapter(MainActivity.this, list); gridView.setAdapter(baseAdapter); } //设置无限轮播图的适配器 if (pagerAdapter == null) { pagerAdapter = new MyPagerAdapter(MainActivity.this, list); viewPager.setAdapter(pagerAdapter); //viewPager页面改变的监听事件 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //设置小圆点的选中颜色 for (int i = 0; i < images.size(); i++) { if (i == position % images.size()) { images.get(i).setImageResource(R.drawable.shape_selected); } else { images.get(i).setImageResource(R.drawable.shape_select_no); } } } @Override public void onPageScrollStateChanged(int state) { } }); }else { pagerAdapter.notifyDataSetChanged(); } } //Json数据解析的自定义方法 private String streamToString(InputStream inputStream, String encode) { try { //转换流 InputStreamReader streamReader = new InputStreamReader(inputStream, encode); //缓冲流 BufferedReader reader = new BufferedReader(streamReader); //缓冲区 StringBuilder builder = new StringBuilder(); //读取数据 String data = null; while ((data = reader.readLine())!=null){ builder.append(data); } //关流,返回数据 reader.close(); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } }
2. WebActivity.java
package week.three;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
public class WebActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
WebView webView = (WebView) findViewById(R.id.webView);
//加载获取到的传递的路径
String path = getIntent().getStringExtra("path");
webView.loadUrl(path);
//设置页面
WebSettings settings = webView.getSettings();
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setJavaScriptEnabled(true);
}
}
二. 自定义的适配器类:
1. 显示GridView视图的MyBaseAdapter.java
package adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.List;
import bean.GoodsBean;
import week.three.R;
public class MyBaseAdapter extends BaseAdapter{
private Context context;
private List<GoodsBean.DataBean.EssayBean> list;
public MyBaseAdapter(Context context, List<GoodsBean.DataBean.EssayBean> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder = null;
if (view == null){
view = View.inflate(context, R.layout.item_layout,null);
holder = new ViewHolder();
//查找控件
holder.user_name = view.findViewById(R.id.user_name);
holder.web_url = view.findViewById(R.id.web_url);
//绑定数据
view.setTag(holder);
}else {
//解绑数据
holder = (ViewHolder) view.getTag();
}
//获取数据重新赋值
holder.user_name.setText(list.get(i).getAuthor().get(0).getUser_name());
ImageLoader.getInstance().displayImage(list.get(i).getAuthor().get(0).getWeb_url(),holder.web_url);
return view;
}
static class ViewHolder{
ImageView web_url;
TextView user_name;
}
}
2. 显示无限轮播图的MyPagerAdapter.java
package adapter; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.support.v4.view.PagerAdapter; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.List; import bean.GoodsBean; import week.three.WebActivity; public class MyPagerAdapter extends PagerAdapter{ private Context context; private Handler handler; private List<GoodsBean.DataBean.EssayBean> list; public MyPagerAdapter(Context context, List<GoodsBean.DataBean.EssayBean> list, Handler handler) { this.context = context; this.handler = handler; this.list = list; } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, final int position) { //设置视图 ImageView imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.FIT_XY); ImageLoader.getInstance().displayImage(list.get(position%list.size()).getAuthor().get(0).getWeb_url(),imageView); //imageView触摸的监听事件 imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { boolean isTiaoZhuan = true; //设定标志为true switch (motionEvent.getAction()){ //获取触摸的动作 case MotionEvent.ACTION_DOWN: isTiaoZhuan = false; handler.removeCallbacksAndMessages(null); break; case MotionEvent.ACTION_MOVE: isTiaoZhuan = false; handler.removeCallbacksAndMessages(null); break; case MotionEvent.ACTION_CANCEL: isTiaoZhuan = false; handler.sendEmptyMessageDelayed(0,2888); break; //抬起后的动作时,获取图片路径,进行跳转页面 case MotionEvent.ACTION_UP : if (isTiaoZhuan){ String web_url = list.get(position%list.size()).getAuthor().get(0).getWeb_url(); Intent intent = new Intent(context, WebActivity.class); intent.putExtra("path",web_url); context.startActivity(intent); } handler.sendEmptyMessageDelayed(0,2888); break; } //自己处理触摸事件....如果当前位置返回了true,,,点击事件将不会执行,,,表示动作自己处理,不会传递 return true; } }); //添加视图到容器 container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }
三. 自定义封装王母哦数据的bean包实体类(导入Gson包)
四. 配置imageloader类,缓存图片到SD卡的工具类(导入ImageLoader包)
package util; import android.app.Application; import android.content.Context; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator; import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import com.nostra13.universalimageloader.core.download.BaseImageDownloader; import com.nostra13.universalimageloader.utils.StorageUtils; import java.io.File; public class ImageUtil extends Application{ @Override public void onCreate() { super.onCreate(); inconfig(this); } //配置ImageLoader类 public void inconfig(Context context){ File cacheDir = StorageUtils.getCacheDirectory(context); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .memoryCacheExtraOptions(480, 800) // default = device screen dimensions .threadPriority(Thread.NORM_PRIORITY - 1) // default .tasksProcessingOrder(QueueProcessingType.FIFO) // default .denyCacheImageMultipleSizesInMemory() .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) .memoryCacheSize(2 * 1024 * 1024) .memoryCacheSizePercentage(13) // default .diskCache(new UnlimitedDiscCache(cacheDir)) // default .diskCacheSize(50 * 1024 * 1024) .diskCacheFileCount(100) .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default .imageDownloader(new BaseImageDownloader(context)) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default .writeDebugLogs() .build(); ImageLoader.getInstance().init(config); } }
五.drawable文件夹下设置小圆点的布局文件:
1. shape_selected.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#00b7ff"></solid>
<corners android:radius="5dp"></corners>
<size android:width="5dp" android:height="5dp"></size>
</shape>
2. shape-select_no.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#dfdfdf"></solid>
<corners android:radius="5dp"></corners>
<size android:width="5dp" android:height="5dp"></size>
</shape>
六.layout文件夹下设置显示视图的布局文件:
1. activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="288dp">
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/lineLayout"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="18dp"
android:layout_centerHorizontal="true"
android:layout_alignBottom="@+id/viewPager"></LinearLayout>
</RelativeLayout>
<GridView
android:numColumns="2"
android:scrollbars="none"
android:id="@+id/gridView"
android:verticalSpacing="12dp"
android:horizontalSpacing="3dp"
android:layout_marginTop="12dp"
android:layout_width="match_parent"
android:layout_height="match_parent"></GridView>
</LinearLayout>
2. activity_web.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"></WebView> </RelativeLayout>
3. item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/web_url"
android:layout_width="150dp"
android:layout_height="120dp"
android:layout_marginLeft="10dp"
android:layout_gravity="center_horizontal"/>
<TextView
android:textSize="16sp"
android:id="@+id/user_name"
android:layout_marginTop="6dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
</LinearLayout>
七. 在AndroidManifest.xml文件中添加:
1. 写入文件到SD卡的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
2. 获取网络数据的权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
3. 声明imageloader类的name属性:
android:name="util.ImageUtil"