经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android开发过程中的坑及解决方法收录(四) - Stars-one
来源:cnblogs  作者:Stars-one  时间:2018/12/10 9:37:11  对本文有异议

1.某个控件要放在Linearlayout布局的底部(底部导航条)

  1. <LinearLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:orientation="vertical"
  7. android:layout_height="match_parent"
  8. ...>
  9. <LinearLayout
  10. android:layout_width="match_parent"
  11. android:orientation="vertical"
  12. android:layout_height="0dp"
  13. android:Layout_weight="2">
  14. ...//嵌套的其他布局……
  15. </LinearLayout>
  16. ...//嵌套的其他布局
  17. <LinearLayout
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content">
  20. </LinearLayout>
  21. </LinearLayout>

简单说明一下,上面的代码中有一个Linearlayout,里面嵌套了两个Linearlayout

这里的关键是嵌套里面的第一个Linearlayout布局,注意这个布局里面的这两行属性代码

  1. `android:layout_height="0dp"`
  2. `android:Layout_weight="2"`

第二个Linearlayout就是可以放在底部的一个Linearlayout(当然你可以写你自己的布局)

2.RecyclerView显示图片卡顿优化

思路:图片太多,显示卡顿的原因主要是因为在RecyclerView滑动的过程中同时加载网络的图片,所以卡顿。

我们实现滑动的时候不加载网络图片,当不滑动的时候再加载网络图片,这样流畅度就可以提高许多

  1. RecyclerViewAdapter(自己写的)中添加一个判断RecyclerView是否滑动的boolean变量isScrolling

    1. protected boolean isScrolling = false;
    2. public void setScrolling(boolean scrolling) {
    3. isScrolling = scrolling;
    4. }
  2. 之后在Adapter里面的onBindViewHolder方法控制加载图片

    1. @Override
    2. public void onBindViewHolder(ViewHolder holder, int position) {
    3. String url = mlist.get(position).getImg().getUrl();
    4. if (!isScrolling){
    5. //我使用的是Ion显示图片框架
    6. //如果不在滑动,则加载网络图片
    7. Ion.with(holder.imageView.getContext())
    8. .load(url)
    9. .withBitmap()
    10. .placeholder(R.drawable.grey)
    11. .intoImageView(holder.imageView);
    12. }else {
    13. //如果在滑动,就先加载本地的资源图片
    14. Drawable temp = holder.imageView.getResources().getDrawable(R.drawable.grey, null);
    15. holder.imageView.setImageDrawable(temp);
    16. }
    17. }
  3. 在相应的Activity中调用RecyclerViewaddOnScrollListener方法,设置一个滑动监听器

    1. mRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
    2. @Override
    3. public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    4. if (newState == RecyclerView.SCROLL_STATE_IDLE) { // 滚动静止时才加载图片资源,极大提升流畅度
    5. adapter.setScrolling(false);
    6. adapter.notifyDataSetChanged(); // notify调用后onBindViewHolder会响应调用
    7. } else{
    8. adapter.setScrolling(true);
    9. }
    10. super.onScrollStateChanged(recyclerView, newState);
    11. }
    12. });

3.ScrollView与RecyclerView滑动冲突

这里使用NestedScrollView即可,然后设置RecyclerViewNestedScrollingEnabled属性为false

两种方法设置RecyclerViewNestedScrollingEnabled属性

  1. - 调用`RecyclerView``setNestedScrollingEnabled`方法
  2. - xml文件里面,把`RecyclerView`直接设置为`flase`

判断ScrollView是否滑动到底部

ScrollView添加一个滑动监听器,然后进行相关处理

  1. mNestedsv.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
  2. @Override
  3. public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
  4. View view = mNestedsv.getChildAt(0);
  5. if (mNestedsv.getHeight()+mNestedsv.getScrollY() ==view.getHeight()){
  6. //相关提示
  7. //相关操作
  8. //下拉刷新,数据更新操作
  9. //...
  10. }
  11. }
  12. });

4.使用okhttp返回数据相同解决方法

看了资料,好像是respone.body().string()只能调用一次,还有okhttp是有缓存的

使用的情景:有一个API接口,每次访问改接口,都会返回不同的json数据,但是使用okhttp,每次访问该API返回的数据都是相同

我的解决方法:

给API请求时添加参数,有些API是可以带参数的,可以修改参数,达到是不同网址的效果

5.RecyclerView数据更新

调用AdapternotifyDataSetChanged方法即可

使用需要注意的是,List必须是同一个对象,调用List.addAll方法即可把另外一个同类List里面的全部数据存放进去

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号