> GridView 默认是纵向的列表,横向的话 需要重新设置;
android GridView两行水平滚动实现效果- https://blog.csdn.net/qq_21249787/article/details/52711651
Android 横向列表GridView 实现横向滚动- https://www.jianshu.com/p/9e1fa3d8a562
> RecyclerView 默认是纵向的列表,横向的话 需要重新设置;
- RecyclerView#Adapter使用中的两个陷阱- https://www.jianshu.com/p/4f66c2c71d8c
通常我们的理解是这样的:
页面进入时,显示RecyclerView,调用onAttachedToRecyclerView,做一些注册工作;
页面退出时,销毁RecyclerView,调用onDetachedFromRecyclerView,做一些解注册和其他资源回收的操作。
在调用setAdapter方法时,新设置的Adapter会调用onAttachedToRecyclerView,原有的Adapter会调用onDetachedFromRecyclerView。
所以如果覆写了onDetachedFromRecyclerView,为了确保被调用,需要在页面退出时,手动调用setAdapter(null)。
我们也如第一个方法般调用了:
onViewAttachedToWindow中做一些注册工作;
onViewDetachedFromWindow中做一些解注册和释放资源的工作。
在RecyclerView正常滚动时,这两个方法都会被调用。然而页面退出时,onViewDetachedFromWindow并不会被调用!
- 设计一个RecyclerView的基类,在基类中做如下处理:
public class BaseRecyclerView extends RecyclerView implements LifecycleObserver {
public BaseRecyclerView(@NonNull Context context) {
super(context);
init(context);
}
public BaseRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public BaseRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
if (context instanceof LifecycleOwner) {
((LifecycleOwner) context).getLifecycle().addObserver(this);
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestory() {
/*
确保Adapter#onDetachedFromRecyclerView被调用
*/
setAdapter(null);
}
@Override
public void setLayoutManager(LayoutManager layoutManager) {
super.setLayoutManager(layoutManager);
if (layoutManager instanceof LinearLayoutManager) {
/*
确保Adapter#onViewDetachedFromWindow被调用
*/
((LinearLayoutManager) layoutManager).setRecycleChildrenOnDetach(true);
}
}
}