Android开发过程中的坑及解决方法收录
Posted Stars-one
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发过程中的坑及解决方法收录相关的知识,希望对你有一定的参考价值。
1.某个控件要放在Linearlayout布局的底部(底部导航条)
<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:orientation="vertical"
android:layout_height="match_parent"
...>
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="0dp"
android:Layout_weight="2">
...//嵌套的其他布局……
</LinearLayout>
...//嵌套的其他布局
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
</LinearLayout>
</LinearLayout>
简单说明一下,上面的代码中有一个Linearlayout,里面嵌套了两个Linearlayout
这里的关键是嵌套里面的第一个Linearlayout
布局,注意这个布局里面的这两行属性代码
`android:layout_height="0dp"`
`android:Layout_weight="2"`
第二个Linearlayout就是可以放在底部的一个Linearlayout(当然你可以写你自己的布局)
2.RecyclerView显示图片卡顿优化
思路:图片太多,显示卡顿的原因主要是因为在RecyclerView滑动的过程中同时加载网络的图片,所以卡顿。
我们实现滑动的时候不加载网络图片,当不滑动的时候再加载网络图片,这样流畅度就可以提高许多
在
RecyclerView
的Adapter(自己写的)
中添加一个判断RecyclerView
是否滑动的boolean变量isScrolling
protected boolean isScrolling = false; public void setScrolling(boolean scrolling) { isScrolling = scrolling; }
之后在
Adapter
里面的onBindViewHolder
方法控制加载图片@Override public void onBindViewHolder(ViewHolder holder, int position) { String url = mlist.get(position).getImg().getUrl(); if (!isScrolling){ //我使用的是Ion显示图片框架 //如果不在滑动,则加载网络图片 Ion.with(holder.imageView.getContext()) .load(url) .withBitmap() .placeholder(R.drawable.grey) .intoImageView(holder.imageView); }else { //如果在滑动,就先加载本地的资源图片 Drawable temp = holder.imageView.getResources().getDrawable(R.drawable.grey, null); holder.imageView.setImageDrawable(temp); } }
在相应的
Activity
中调用RecyclerView
的addOnScrollListener
方法,设置一个滑动监听器mRv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { // 滚动静止时才加载图片资源,极大提升流畅度 adapter.setScrolling(false); adapter.notifyDataSetChanged(); // notify调用后onBindViewHolder会响应调用 } else{ adapter.setScrolling(true); } super.onScrollStateChanged(recyclerView, newState); } });
3.ScrollView与RecyclerView滑动冲突
这里使用NestedScrollView
即可,然后设置RecyclerView
的NestedScrollingEnabled
属性为false
两种方法设置RecyclerView
的NestedScrollingEnabled
属性
- 调用`RecyclerView`的`setNestedScrollingEnabled`方法
- 在xml文件里面,把`RecyclerView`直接设置为`flase`
判断ScrollView是否滑动到底部
给ScrollView
添加一个滑动监听器,然后进行相关处理
mNestedsv.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
View view = mNestedsv.getChildAt(0);
if (mNestedsv.getHeight()+mNestedsv.getScrollY() ==view.getHeight()){
//相关提示
//相关操作
//下拉刷新,数据更新操作
//...
}
}
});
4.使用okhttp返回数据相同解决方法
看了资料,好像是respone.body().string()
只能调用一次,还有okhttp是有缓存的
使用的情景:有一个API接口,每次访问改接口,都会返回不同的json数据,但是使用okhttp,每次访问该API返回的数据都是相同
我的解决方法:
给API请求时添加参数,有些API是可以带参数的,可以修改参数,达到是不同网址的效果
5.RecyclerView数据更新
调用Adapter
的notifyDataSetChanged
方法即可
使用需要注意的是,List必须是同一个对象,调用List.addAll方法即可把另外一个同类List里面的全部数据存放进去
以上是关于Android开发过程中的坑及解决方法收录的主要内容,如果未能解决你的问题,请参考以下文章
ionic的actionsheet安卓样式不正常的坑及解决之道
python-flask复习—— 装饰器的坑及解决办法flask中的路由/实例化配置/对象配置/蓝图/特殊装饰器(中间件重定义错误页面)