请求的是网络数据所以需要一些依赖
//okhhtp的依赖
implementation'com.squareup.okhttp3:okhttp:3.11.0'
//图片加载的依赖
implementation'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
//recyclerview的依赖
implementation'com.android.support:recyclerview-v7:28.0.0-alpha3'
implementation'com.android.support:design:28.0.0-alpha3'
//gson解析的依赖
implementation'com.google.code.gson:gson:2.8.5'
//网络日志拦截器
implementation'com.squareup.okhttp3:logging-interceptor:3.11.0'
//RecyclerView 上啦加载下拉刷新 https://github.com/XRecyclerView/XRecyclerView
implementation('com.jcodecraeer:xrecyclerview:1.5.9') {
exclude group:'com.android.support'
}
//导入Glide版本记得使用此版本
implementation'com.github.bumptech.glide:glide:3.8.0'
//轮播图 https://github.com/youth5201314/banner
implementation'com.youth.banner:banner:1.4.10'
因为是网络请求所以 用的是OkHttp 所以封装了简单的工具类 之前的博客中有相关的代码
由于是网络请求所以 又有相关的bean层 但是请求内容不一样
一.1. 轮播图的bean包import android.app.Application;
public class BannerData {
public Listdata;
}
2.banner中的分层
public class BannerImage {
public Stringdesc;
public int id;
public StringimagePath;
public int isVisible;
public int order;
public Stringtitle;
public int type;
public Stringurl;
}
二.展示 列表的bean包
2.1
public class RootData {
public int status;
public Stringmessage;
public Listdata;
}
2.2
public class Shop {
public String_id;
public int id;
public Stringname;
public int month_sales;
public Stringmonth_sales_tip;
public double wm_poi_score;
public double delivery_score;
public double quality_score;
public double pack_score;
public double food_score;
public Stringdelivery_time_tip;
public Stringthird_category;
public Stringpic_url;
public Stringshopping_time_start;
public Stringshopping_time_end;
public int min_price;
public Stringmin_price_tip;
public int shipping_fee;
public Stringshipping_fee_tip;
public Stringbulletin;
public Stringaddress;
public Stringcall_center;
public Stringdistance;
public Stringaverage_price_tip;
public int comment_number;
public Stringlng;
public Stringlat;
public int __v;
public Stringcreated_at;
}
由于轮播图的展示运用Glide 所以下面操作很重要
1.声名了 App的类继承了Application 三级缓存 二次采样
public class Appextends Application {
public static Contextcontext;
@Override
public void onCreate() {
super.onCreate();
context =this;
//初始化加载图片
initLoader();
}
private void initLoader() {
String path = Environment.getExternalStorageDirectory() +"Image";
File cache =new File(path);
ImageLoaderConfiguration config =new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480,800)
.diskCacheExtraOptions(480,800,null)
.threadPoolSize(3)
.threadPriority(Thread.NORM_PRIORITY -2)
.memoryCache(new LruMemoryCache(2 *1024 *1024))
.memoryCacheSize(2 *1024 *1024)
.memoryCacheSizePercentage(13)
.diskCache(new UnlimitedDiskCache(cache))
.diskCacheSize(50 *1024 *1024)
.diskCacheFileCount(100)
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.writeDebugLogs()
.build();
ImageLoader.getInstance().init(config);
}
//图片处理
public static DisplayImageOptions getOptions () {
DisplayImageOptions options =new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher)
.showImageForEmptyUri(R.mipmap.ic_launcher)
.showImageOnFail(R.mipmap.ic_launcher)
.resetViewBeforeLoading(false)
.delayBeforeLoading(0)
.cacheInMemory(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.bitmapConfig(Bitmap.Config.ARGB_8888)
.displayer(new RoundedBitmapDisplayer(300))
.handler(new Handler())
.build();
return options;
}
}
2.又创建了一个简单的Glide的工具类
public class GlideImageloaderextends ImageLoader {
@Override
public void displayImage(Context context, Object path, ImageView imageView) {
//Glide 简单加载图片的方法
//通过类来获得图片
Glide.with(context).load(((BannerImage)path).imagePath).into(imageView);
}
}
3.适配器
public class ShopAdapterextends RecyclerView.Adapter {
Listdata;
Contextcontext;
LayoutInflaterinflater;
ImageLoaderimageLoader;
DisplayImageOptionsoptions;
public ShopAdapter(Context context) {
this.data =new ArrayList<>();
this.context = context;
this.inflater = LayoutInflater.from(context);
options =new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.build();
imageLoader = ImageLoader.getInstance();
}
/**
* 添加数据
*
* @param list
*/
public void addData(List list) {
this.data.addAll(list);
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,int i) {
View view =
inflater.inflate(R.layout.item_list,viewGroup,false);
return new ShopViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder,int i) {
Shop shop =data.get(i);
/**
* java 中的instanceof 运算符是用来在运行时指出对象是否
* 是特定类的一个实例。instanceof通过返回一个布尔值来指出,
* 这个对象是否是这个特定类或者是它的子类的一个实例。
*/
if (viewHolderinstanceof ShopViewHolder){
ShopViewHolder holder = (ShopViewHolder) viewHolder;
holder.textView.setText(shop.name);
imageLoader.displayImage(shop.pic_url,holder.imageView,options);
}
}
@Override
public int getItemCount() {
return data.size();
}
/**
* 静态内部类 适配器的自定义ViewHolder
*/
static class ShopViewHolderextends RecyclerView.ViewHolder{
ImageViewimageView;
TextViewtextView;
public ShopViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.img_shop);
textView = itemView.findViewById(R.id.txt_shop);
}
}
}
4.接下来是重头戏 主页面显示内容
public class ShopActivityextends AppCompatActivity {
private XRecyclerViewxRecyclerView;
int page =0;
ShopAdaptershopAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shop);
initView();
getData(page);
getBannerData();
}
private void initView() {
xRecyclerView = findViewById(R.id.xRecycler);
xRecyclerView.setLoadingMoreEnabled(true);//加载更多
xRecyclerView.setPullRefreshEnabled(true);//下拉刷新
//监听
xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
//刷新
@Override
public void onRefresh() {
page =0;
getData(page);
}
//加载
@Override
public void onLoadMore() {
page++;
getData(page);
}
});
//布局管理器
LinearLayoutManager manager =new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
xRecyclerView.setLayoutManager(manager);
//分割线
xRecyclerView.addItemDecoration(new DividerItemDecoration(this, OrientationHelper.VERTICAL));
//适配器
shopAdapter =new ShopAdapter(this);
xRecyclerView.setAdapter(shopAdapter);
}
public void getData(int page) {
Ok.getOk().doGet("http://39.108.3.12:3000/v1/restaurants?offset="+page+"&limit=10&lng=116.29845&lat=39.95933",new OkCallBack() {
@Override
public void onUI(String json) {
Gson gson =new Gson();
RootData rootData = gson.fromJson(json, RootData.class);
shopAdapter.addData(rootData.data);
//加载完成
xRecyclerView.refreshComplete();
xRecyclerView.loadMoreComplete();
}
@Override
public void failed(String json) {
//加载完成
xRecyclerView.refreshComplete();
xRecyclerView.loadMoreComplete();
}
});
}
/**
* 获得图片
*/
public void getBannerData(){
Ok.getOk().doGet("http://www.wanandroid.com/banner/json",new OkCallBack() {
@Override
public void onUI(String json) {
Gson gson =new Gson();
BannerData bannerData = gson.fromJson(json, BannerData.class);
//添加轮播图
View view = View.inflate(ShopActivity.this, R.layout.layout_banner,null);
Banner banner = view.findViewById(R.id.banner);
//设置图片加载器
banner.setImageLoader(new GlideImageloader());
banner.setImages(bannerData.data);
//设置方法全部调用完毕时最后调用
banner.start();
xRecyclerView.addHeaderView(view);
}
@Override
public void failed(String json) {
}
});
}
}
网友评论