如图,Android 编程,右侧三个recyclerview布局,为啥是靠顶部,不是居中的?布局
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如图,Android 编程,右侧三个recyclerview布局,为啥是靠顶部,不是居中的?布局相关的知识,希望对你有一定的参考价值。
如图,android 编程,右侧三个recyclerview布局,为什么是靠顶部,不是居中的?布局文件中,recyclerview在父类中的布局设置了居中,recyclerview内容也设置了居中,每个item在父类中和内容也设置了居中,为什么还是靠顶部?
你可以在每个recyclerview 外面套一个 relative布局 然后recyclerview高度设置wrap 加一个alignparentcenter = true追问我改成 rv1.setLayoutManager(new GridLayoutManager(this, 1, LinearLayoutManager.HORIZONTAL, false));
就可以居中了,之前设置成LinearLayoutManager不知道怎么就不可以
解决了就好 这个recyclerview控件我还没接触过呢 好用不效率是比listview高么
追问我也刚学,比listview方便很多。功能也强大很多。
参考技术A 肯定xml布局文件里没设置对,代码贴出来看看追问我改成 rv1.setLayoutManager(new GridLayoutManager(this, 1, LinearLayoutManager.HORIZONTAL, false));
就可以居中了,之前设置成LinearLayoutManager不知道怎么就不可以
Bitmap.recycle引发的血案
从Bitmap.recycle说起
在Android中,Bitmap的存储分为两部分,一部分是Bitmap的数据,一部分是Bitmap的引用。
在Android2.3时代,Bitmap的引用是放在堆中的,而Bitmap的数据部分是放在栈中的,需要用户调用recycle方法手动进行内存回收,而在Android2.3之后,整个Bitmap,包括数据和引用,都放在了堆中,这样,整个Bitmap的回收就全部交给GC了,这个recycle方法就再也不需要使用了。
然而……
现在的SDK中对recycle方法是这样注释的,如图所示:
可以发现,系统建议你不要手动去调用,而是让GC来进行处理不再使用的Bitmap。我们可以认为,即使在Android2.3之后的版本中去调用recycle,系统也是会强制回收内存的,只是系统不建议这样做而已。
鄙司代码有些是从Android2.3出来的,因此很多地方还在使用Bitmap.recycle。通常情况下,这也没什么问题,但是,今天遇到一个bug引发了Bitmap.recycle的血案。
起因
这个bug的起因是因为我们的一张图片需要旋转,同时可以设置一个旋转角度,老的代码是这样写的:
ImageView imageView = (ImageView) findViewById(R.id.test);
Matrix matrix = new Matrix();
matrix.setRotate(0.013558723994643297f);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
Bitmap targetBmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
if (!bitmap.isRecycled()) {
bitmap.recycle();
}
imageView.setImageBitmap(targetBmp);
除了中间的0.013558723994643297f这串比较奇葩的数据(当然,正常情况下都是20、30这样正常的数),其它都是比较正常的代码。
但实际上,只要一运行这段代码,程序就会崩溃,错误原因如下所示:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xys.preferencetest, PID: 30512
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@1a50ff6b
这个问题一看就知道是由于Bitmap被调用recycle方法回收后,又调用了Bitmap的一些方法而导致的。可是,代码中可以发现我们recycle的是bitmap而不是通过Bitmap.createBitmap重新生成的targetBmp,为什么会报这个exception呢?
注释
按道理来说,bitmap与create出来的targetBmp应该是两个对象,当旋转角度正常的时候,确实也是这样,但当旋转角度比较奇葩的时候,这两个bitmap对象居然变成了同一个!而打开Bitmap.createBitmap的代码,可以发现如下所示的注释:
这里居然写着:The new bitmap may be the same object as source, or a copy may have been made.
看来还是真有可能为同一个对象的!
猜测
经过几次尝试,发现只有在角度很小很小的时候,才会出现这个情况,两个bitmap是同一个对象,因此,我只能这样猜测,当角度过小时,系统认为这是一张图片,没有发生变化,那么系统就直接引用同一个对象来进行操作,避免内存浪费。那么这个角度是怎么来的呢?继续猜测,如图所示:
当图像的旋转角度小余两个像素点之间的夹角时,图像即使选择也无法显示,因此,系统完全可以认为图像没有发生变化,因此,注释中的情况,是不是有可能就是说的这种情况呢?
我还没有来得及继续验证,希望大家可以一起讨论下~有说的不对的还请指教。
然而……
然而,教训是,在不兼容Android2.3的情况下,别在使用recycle方法来管理Bitmap了,那是GC的事!
以上是关于如图,Android 编程,右侧三个recyclerview布局,为啥是靠顶部,不是居中的?布局的主要内容,如果未能解决你的问题,请参考以下文章
Android Honeycomb 中的 Bitmap#recycle() 实际上做了啥?
无法从firebase数据库android,recycler视图中检索数据
Android recycler view onItemClick 识别适配器