本文汇集本人开发要解决一些疑难杂症的代码集合,方便以后自己要用到的时候又跑去搜索解决,只需要来这里 Ctrl + F 搜索一下关键即可。本文也含有来自各前辈的经验,也不记得是谁的链接看到的了,如有知道,则提示一下补全。感谢!!!
RecyclerView 边缘渐变效果
requiresFadingEdge 属性:
- none(边框颜色不变)
- horizontal(水平方向颜色变淡)
- vertical(垂直方向颜色变淡)
- fadingEdgeLength:用来设置边框渐变的长度
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:requiresFadingEdge="vertical"
android:fadingEdgeLength="30dp"/>
如果只要一部分,则重写 RecyclerView
重写recycleView的类,重新设置返回值。
- getTopFadingEdgeStrength(); 重写这个方法,设置返回值是0,去掉顶部阴影;
- getBottomFadingEdgeStrength(); 重写这个方法,设置返回值是0,去底顶部阴影
- getLeftFadingEdgeStrength(); 重写这个方法,设置返回值是0,去掉左部阴影
- getRightFadingEdgeStrength(); 重写这个方法,设置返回值是0,去掉右部阴影
Java 获取随机数的常用两种方式
- new Random()
new Random().nextInt(4); //【0,4) 范围 :0,1,2,3
- Math.random();返回的数值是 [0.0,1.0)范围 double 型数值,由于double类数的精度很高,可以在一定程度下看做随机数,借助(int)来进行类型转换就可以得到整数随机数了
int max=100,min=1; int ran2 = (int) (Math.random()*(max-min)+min); System.out.println(ran2);
设置 RecyclerView 滚动到指定的 position item 顶部
继承 LinearSmoothScroller 类,重写 getVerticalSnapPreference() 或者 getHorizontalSnapPreference() 方法,主要看你设置的 LayoutManager 的返现,我这里是设置了竖直方向的滚动,所以我下面重写的是 getVerticalSnapPreference()。
/**
* @author: Haegyeong
* @date: 2021/5/9 9:29
* @description: 设置 RecyclerView 滚动到指定的 position item 顶部
* @version: 1.0
*/
public class LinearTopSmoothScroller extends LinearSmoothScroller {
public LinearTopSmoothScroller(Context context) {
super(context);
}
@Override
protected int getVerticalSnapPreference() {
return SNAP_TO_START;
}
}
调用处代码
//设置Item 滚动到前面
mBinding.recyclerview.post(new Runnable() {
@Override
public void run() {
LinearSmoothScroller smoothScroller = new LinearTopSmoothScroller(getContext());
smoothScroller.setTargetPosition(mAdapter.getFooterViewPosition());
layoutManager.startSmoothScroll(smoothScroller);
}
});
记录一个懵逼 3 小时的 Fragment 异常。
java.lang.IllegalArgumentException: No view found for id 0x7f09012b (com.xxx.abc:id/flContainer) for fragment CommentsLikeFragment{c4cef62 (5951d882-b5db-43d4-9e90-740e067241d7) id=0x7f09012b like}
一般看到提示 No view found for id 0x7f09012b (com.xxx.abc:id/flContainer) for fragment CommentsLikeFragment 那就是找不到 Fragment 的容器ID。
也就是 fragmentTransaction.add( containerViewId, commentFragment, "recommend") ,正常的在 FragmentActivity 或者 Fragment 使用,只要你 对应上 View 布局的容器 id ,就不会报错了。
因为业务需求的功能需要,我在 RecyclerView 的 Item上使用了(在尾部的 FooterView 添加了评论列表),然后一直报这个错误,搞的我都怀疑人生,写了几年都是这样的写法,怎么突然就错了呢,怎么百度、Google 都是说和布局上的容器 Id 对应不上,复制粘贴几十次,都依旧有问题,后面才发现是因为进来页面的时候,因为是添加在 RecyclerView 的 item 中,而进来页面的时候,RecyclerView 的 Item 也还没有 Attach 到 Window上,所以 FragmentContainer 还没找到这个 id,异常就爆出了该异常。
解决方案
//注意:先把 Fragment 添加到 Transaction 中,先不用 commit
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction()
.add(footerBinding.flCommentContainer.getId(), commentFragment, "recommend");
然后,使用 addOnAttachStateChangeListener 方法来监听 View 的 attach 状态,只要 view Attach 到 Window 窗口,那么就 调用 fragmentTransaction.commit(); 来提交本次 Fragment 添加,即可成功解决问题。
footerBinding.getRoot().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
footerBinding.getRoot().removeOnAttachStateChangeListener(this);
if (!commentFragment.isAdded() || !likeFragment.isAdded()) {
fragmentTransaction.commit();
}
}
@Override
public void onViewDetachedFromWindow(View v) {
}
});
插件版本与Gradle 对应版本号
![](https://img.haomeiwen.com/i2096345/090e9f136835329e.png)
ViewGroup 隐藏显示 View 开启动画,只需要 ViewGroup 添加以下代码就可以了。
android:animateLayoutChanges="true"
网友评论