ScrollView嵌套ListView,ListView显示不全的问题是一个老生常谈的问题,不建议嵌套有时候又身不由己呀,对于有些页面多布局和加header都不好用但是使用LinearLayout又不方便的时候,怎么看都是嵌套起来最简单,我们这些开发人员又能怎么办呢?那就怎么实现容易怎么来吧。
解决ScrollView和ListView滑动冲突和只显示一行
重新写一个View继承ListView,重写onMeasure方法,如下
public class ListViewForScrollView extends ListView {
public ListViewForScrollView(Context context) {
super(context);
}
public ListViewForScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListViewForScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
/**
* 重写该方法,达到使ListView适应ScrollView的效果
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
这样基本上就解决冲突了,但是由于ListView高度经过就算,ListView完整加载完后又添加进ScrollView中,所以关于ListView复用item布局的优化就废了,所以当ListView的item很少的时候可以,很多的时候就请另辟蹊径吧!
解决ScrollView和RecyclerView滑动冲突和只显示一行
RecyclerView这个View不像是ListView,它既需要一个”适配器“Adapter又需要一个”布局管理者“LayoutManager,像GridLayoutManager、LinearLayoutManager我们就经常会用到。话不多说,赶紧说怎么解决,在Recycler外面嵌套一层布局,例如:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_similar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
很多人肯定和我一样惊呆了,what the fuck?然后一万匹...
其实是外面嵌套的布局帮你计算高度了,也有人说需要在外面嵌套布局加上这行代码
android:descendantFocusability="blocksDescendants"
你不加发现也可以呀,怎么回事,这行代码是干什么的,往下看
imagebeforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
我猜测可能这个人想解决滑动冲突,至于用不用加读者自己判断吧,我相信很多人会加,加了有没有坏处吗!(让我想起了一句话,吃保健品即使没有好处又没有坏处吗)然后你会发现滑动冲突还在的,那具体怎么解决滑动冲突呢?
创建LayoutManager的时候想解决水平滑动冲突就重写canScrollHorizontally方法想解决竖直滑动冲突就重写canScrollVertically方法如下
GridLayoutManager similarLayoutManager = new GridLayoutManager(this, 4){
@Override
public boolean canScrollVertically() {
return false;
}
@Override
public boolean canScrollHorizontally() {
return false;
}
};
别的LayoutManager也是一样,return false了RecyclerView也就不能滑动了。
网友评论