本文是对上篇文章的进一步深入理解
【上文地址】:Retrofit2.1.0 + Glide + ToolBar + RecyclerView
Retrofit2.1.0 使用补充
Retrofit网络请求有GET、POST、DELETE还有PUT的方式,我只使用了GET方式,所以在这里也就谈谈我的使用吧(小白学习记录,有错指出,共同学习)。
- 使用Retrofit需要准备如下内容
- 添加Retrofit依赖
- 数据实体(bean)
- Service
- @Path(url问号之前的参数)
有这么一个url:http://gank.io/api/data/Android/10/1
那么Service可以写成如下:
public interface GankService {
@GET("api/data/{type}/{pageSize}/{page}")
Call<GankResult> getResult(
@Path("type") String type,
@Path("pageSize") int pageSize,
@Path("page") int page) ;
}
- @Query(url问号之后的参数)
聚合数据中笑话大全的url:http://japi.juhe.cn/joke/content/text.from?key=您申请的KEY&page=1&pagesize=10
那么Service可以写成如下:(可以看出这里结合了@Path和@Query的使用)
public interface GankJokerService {
@GET("{type}/text.from?")//type可以有joker和img
Call<GanFunJokerResult> getResult(
@Path("type") String type,
@Query("key") String key,
@Query("page") int page,
@Query("pagesize") int pagesize) ;
}
- @QueryMap(url问号之后的参数,可以看作是多个@Query)
有这样的url:http://v.juhe.cn/toutiao/index?type=top&key=APPKEY
其中top为参数类型,有多个可选。APPKEY为聚合数据中申请的APPKEY,那么Service可以写成如下:
public interface NewsService {
@GET("toutiao/index")
Call<NewsResult> getResult(@QueryMap HashMap<String, Object> map);
}
Glide的其它使用
Glide为Google推荐的图片加载框架,使用需要添加依赖
compile 'com.github.bumptech.glide:glide:3.7.0'
- 加载
Bitmap
,加载视频的第一帧
Glide.with(mContent).load(imageUrl).asBitmap().into(holder.imageView) ;
- 加载
Gif
Glide.with(mContent).load(imageUrl).asGif().into(holder.imageView) ;
- 加载默认图片
placeholder
Glide.with(mContent).load(imageUrl).placeholder(R.mipmap.deflat_photo).into(holder.imageView) ;
ToolBar 沉浸式
沉浸式(管他是不是叫这个名字)是在Android4.4至以后的版本才出现,因此为了兼容低版本,需要设置如下内容。
- 第一步(判断版本号,显示顶部系统的UI样式)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}else if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes() ;
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags ;
}
- 第二步(将状态栏透明化)
在value/style.xml中设置
<!--在Android 4.4之前的版本上运行,直接跟随系统主题-->
<style name="TranslucentTheme" parent="AppTheme" />
在value-v19/style.xml中设置
<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">false</item>
</style>
在value-v21/style.xml中设置
<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">false</item>
<!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
- 第三步(给状态栏着色)
<android.support.v7.widget.Toolbar android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary" //着色
android:fitsSystemWindows="true" //让状态栏与Toolbar分开,否则会布局混乱
toolbar:titleTextColor="#ffffff"
toolbar:popupTheme="@style/ToolbarPopupTheme" //设置菜单的显示位置
>
</android.support.v7.widget.Toolbar>
RecyclerView下拉刷新,上拉加载更多,添加头布局
- RecyclerView是谷歌推荐的替代ListView的控件,但是各有各的好处吧,GitHub上有不少优秀的库可以使用,既然已经有了轮子,我们就不用再去重复造轮子,但是有时间还是需要好好了解轮子是如何造成的。
- 这里介绍一个优秀的库XRecyclerView
- 具体使用可以点击库连接查看,再使用这个库进行分页加载的时候数据要拼接在RecyclerView的后面,文档中采用的是模拟的数据。这里我是这么实现的:
private void getDataFromServer() {//获取服务器的数据
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://v.juhe.cn/")
.addConverterFactory(GsonConverterFactory.create()).build();
NewsService service = retrofit.create(NewsService.class);//Retrofit需要的Service
HashMap<String, Object> map = new HashMap<>();
map.put("key", key);
map.put("type", types[index]);
Call<NewsResult> call = service.getResult(map);//NewsResult为数据实体
call.enqueue(this);//这里需要实现Callback<NewsResult>
}
@Override
public void onResponse(Call<NewsResult> call, Response<NewsResult> response) {
mNewsInfos.addAll(response.body().getResult().getData()) ;//这里是重点,将请求服务器返回的结果添加在集合中
mNewsAdapter.notifyDataSetChanged();//记得刷新数据
}
@Override
public void onFailure(Call<NewsResult> call, Throwable t) {}
ToolBar参考:
GitHub上的开源库—-StatusBarUtil
Android状态栏着色实践
Android开发:最详细的 Toolbar 开发实践总结
Android ToolBar 使用完全解析