权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
依赖
compile 'com.squareup.okhttp3:okhttp:3.10.0' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:recyclerview-v7:26.1.0' compile 'com.google.code.gson:gson:2.2.4'
工具类
public class OkhtttpUtils { //单例模式,把构造方法进行私有化 private OkhtttpUtils(){}; static OkHttpClient client; public static OkHttpClient getInstance(){ if (client==null) { //更加安全 synchronized (OkhtttpUtils.class) { //缓存的地方 mnt/sdcard File file = new File(Environment.getExternalStorageDirectory(), "cache11"); client = new OkHttpClient().newBuilder() .readTimeout(3000, TimeUnit.SECONDS) //设置读取超时时间 .connectTimeout(3000, TimeUnit.SECONDS) //设置连接的超时时间 .cache(new Cache(file, 10 * 1024)) .build(); } } return client; } /** * get请求 * Callback 是一个接口 */ public static void doGet(String url, Callback callback){ //1:拿到okhttpclient 对像 OkHttpClient client = getInstance(); //2:进行请求的操作 Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(callback); } //post请求 /** * * @param url 请求的地址 * @param parms 请求的参数 * @param callback callback */ public static void doPost(String url, Map<String,String> parms,Callback callback){ //得到客户端的对像 OkHttpClient client = getInstance(); //不是FormBody,而是一个Builder FormBody.Builder body = new FormBody.Builder(); //key value for (String key:parms.keySet()){ //value的值 body.add(key,parms.get(key)); } Request request = new Request.Builder() .url(url) .post(body.build()) .build(); client.newCall(request).enqueue(callback); } //用来上传图片的 //url , 图片 ,参数 Callback public static void upImage(String url,File file,String filenName,Map<String,String> params,Callback callback){ OkHttpClient client = getInstance(); //requestBody的实现类 Formbody MultipartBody.Builder builder = new MultipartBody.Builder(); if (params!=null){ for (String key :params.keySet()){ builder.addFormDataPart(key,params.get(key)); } } //设置类型 builder.setType(MultipartBody.FORM); builder.addFormDataPart("file",filenName,RequestBody.create(MediaType.parse("application/octet-stream"),file)); Request request = new Request.Builder() .url(url) .post(builder.build()) .build(); client.newCall(request).enqueue(callback); } }
DataMoudle接口
public interface DataMoudle { void getData(String url,DataPresenter presenter); }
MyDataMoudle类
public class MyDataMoudle implements DataMoudle{ @Override public void getData(String url, final DataPresenter presenter) { //请求数据 OkhtttpUtils.doGet(url, new Callback() { @Override public void onFailure(Call call, IOException e) { } //请求成功时 @Override public void onResponse(Call call, Response response) throws IOException { //得到请求内容 String string = response.body().string(); //解析 Gson gson=new Gson(); JavaBean javaBean = gson.fromJson(string, JavaBean.class); JavaBean.DataBean data = javaBean.getData(); //把得到的数据传给p presenter.success(data); } }); } }
DataPresenter 接口
public interface DataPresenter { void success(JavaBean.DataBean data); void error(); }
MyDataPresenter类
public class MyDataPresenter implements DataPresenter{ private final DataView dataView; private final MyDataMoudle myDataMoudle; //提供有参构造 public MyDataPresenter(DataView dataView){ this.dataView=dataView; //创建出m层对象 myDataMoudle = new MyDataMoudle(); } //请求成功 @Override public void success(JavaBean.DataBean data) { dataView.getZData(data); } @Override public void error() { } //定义通过v层传来来的url,m层请求数据方法 public void getmdata(String url){ myDataMoudle.getData(url,this); } }
DataView 接口
public interface DataView { void getZData(JavaBean.DataBean data); }
MainActivity类
public class MainActivity extends AppCompatActivity implements DataView{ private String url="http://result.eolinker.com/umIPmfS6c83237d9c70c7c9510c9b0f97171a308d13b611?uri=homepage"; private RecyclerView re_view; private ViewPager pager; private int index; private String image; private RecyclerView lunbo; private LinearLayoutManager layoutManager; private LinearLayoutManager layoutManager1; @SuppressLint("HandlerLeak") private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); JavaBean.DataBean data= (JavaBean.DataBean) msg.obj; List<JavaBean.DataBean.Ad1Bean> list = data.getAd1(); //设置适配器 MypagerAdapters adapter = new MypagerAdapters(MainActivity.this, list); lunbo.setAdapter(adapter); lunbo.setHasFixedSize(true); //需要用到一个类,SnapHelper的子类PagerSnapHelper.直接追加到上面的recyclerView.setAdapter(adapter) 后面。 PagerSnapHelper snapHelper = new PagerSnapHelper(); snapHelper.attachToRecyclerView(lunbo); lunbo.scrollToPosition(list.size()*10); //自动轮播 ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { lunbo.smoothScrollToPosition(layoutManager1.findFirstVisibleItemPosition() + 1); } }, 2000, 2000, TimeUnit.MILLISECONDS); List<JavaBean.DataBean.DefaultGoodsListBean> list2 = data.getDefaultGoodsList(); //设置控制器 //LinearLayoutManager manager=new LinearLayoutManager(MainActivity.this,LinearLayoutManager.HORIZONTAL,false); GridLayoutManager manager=new GridLayoutManager(MainActivity.this,3); re_view.setLayoutManager(manager); //为re_view设置适配器 MyReAdapter adapter2=new MyReAdapter(MainActivity.this,list2); re_view.setAdapter(adapter2); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件 re_view = findViewById(R.id.re_view); lunbo = findViewById(R.id.lunbo); layoutManager1 = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); lunbo.setLayoutManager(layoutManager1); //创建p层对象 MyDataPresenter presenter=new MyDataPresenter(this); presenter.getmdata(url); } //得到请求数据方法 @Override public void getZData(JavaBean.DataBean data) { //发送消息给handler Message message=new Message(); message.obj=data; //发送消息 handler.sendMessage(message); } } 轮播图适配器
public class MypagerAdapters extends RecyclerView.Adapter{ Context context; List<JavaBean.DataBean.Ad1Bean> ad1; private ViewHolder viewHolder; public MypagerAdapters(Context context, List<JavaBean.DataBean.Ad1Bean> ad1) { this.context=context; this.ad1=ad1; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.recy_lunbo,parent,false); viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { viewHolder= (ViewHolder) holder; Glide.with(context).load(ad1.get(position%ad1.size()).getImage()).into(viewHolder.re_img); } @Override public int getItemCount() { return Integer.MAX_VALUE; } class ViewHolder extends RecyclerView.ViewHolder { private final ImageView re_img; public ViewHolder(View itemView) { super(itemView); re_img = itemView.findViewById(R.id.item_image); } } }
RecyclerView适配器
public class MyReAdapter extends RecyclerView.Adapter{ Context context; List<JavaBean.DataBean.DefaultGoodsListBean> list2; private MyViewHolder myViewHolder; public MyReAdapter(Context context, List<JavaBean.DataBean.DefaultGoodsListBean> list2) { this.list2=list2; this.context=context; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //引入布局 View view= View.inflate(context, R.layout.recy_item,null); myViewHolder = new MyViewHolder(view); return myViewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { myViewHolder= (MyViewHolder) holder; //赋值 myViewHolder.re_text.setText(list2.get(position).getGoods_name()); Glide.with(context).load(list2.get(position).getGoods_img()).into(((MyViewHolder) holder).re_img); } @Override public int getItemCount() { return list2.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ private final ImageView re_img; private final TextView re_text; public MyViewHolder(View itemView) { super(itemView); re_img = itemView.findViewById(R.id.re_img); re_text = itemView.findViewById(R.id.re_text); } } }
activity_main.xml布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.com.zhoukao1.MainActivity" android:orientation="vertical"> <!--轮播--> <android.support.v7.widget.RecyclerView android:id="@+id/lunbo" android:layout_width="match_parent" android:layout_height="150dp"> </android.support.v7.widget.RecyclerView> <!--加载数据--> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/re_view" > </android.support.v7.widget.RecyclerView> </LinearLayout>
recy_lunbo.xml轮播
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.com.zhoukao1.MainActivity" android:orientation="horizontal"> <ImageView android:id="@+id/item_image" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
recy_item.xml布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.com.zhoukao1.MainActivity" android:orientation="vertical"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/re_img"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/re_text"/> </LinearLayout>