2018第一个星期过了,第一篇博客东拼西凑出来了,之前的博客一直都是东拼西凑总结别人的内容,我暂时没有什么原创,就记录一下平时开发中遇到的问题吧,也算是进步的开始了。
以下详细描述问题以及解决方法:
这个问题主要是由于inflate方法参数不正确引起的。LayoutInflate.inflate()方法概述如下:
三个参数 public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
主要分为三种情况:
root不为null,attachToRoot为true:表示将resource指定的布局添加到root中,添加的过程中resource所指定的的布局的根节点的各个属性都是有效的.如下代码,最后不需要add方法就能加入布局(且不能使用add再添加,否则报错)
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
LayoutInflater inflater = LayoutInflater.from(this);
inflater.inflate(R.layout.linearlayout, ll,true);
root不为null,attachToRoot为false:表示不将resource指定的布局添加到root中,但是resource指定的布局的根布局的布局参数LayoutParams有效。(root会协助resource指定的布局的根节点生成布局参数)
两个参数 public View inflate(@LayoutRes int resource, @Nullable ViewGroup root)
主要分为两种情况:
详细案例请参考http://blog.csdn.net/u012702547/article/details/52628453
解决方案:
在RecyclerView.Adapter中onCreateViewHolder创建布局时采用以下方法:
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_rent_car_list
, parent,false);
index为要移到的position值,是从RecyclerView的item位置开始的,不是从可见位置开始。这样跳转比较生硬,可以采用弹性滑动,以后有时间弄弄
llManager.scrollToPositionWithOffset(index,0);
主要是由于Banner内部的线程没有停止。因此要在BannerView的以下三个方法中停止线程轮播:
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
// 开始轮播
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
// 停止轮播
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
if (visibility == GONE) {
// 停止轮播
} else if (visibility == VISIBLE) {
// 开始轮播
}
super.onWindowVisibilityChanged(visibility);
}
原因:RecyclerView默认会获取焦点,所以解决方法有多种,可以让其他的控件获取焦点,或者不允许RecyclerView获取到焦点。以下提供两种解决方案,亲测有效。
①该方案适用于嵌套的有多个RecyclerView
"match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">
.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"/>
②该方案只适合嵌套的只有一个RecyclerView
carInfoViewHolder.recyclerView.setFocusableInTouchMode(false);
carInfoViewHolder.recyclerView.requestFocus();
解决代码如下。需要注意一点,在ACTION_UP中进行判断。其中:
RecyclerView.canScrollVertically(1)的值表示是否能向上滚动,false表示已经滚动到底部
RecyclerView.canScrollVertically(-1)的值表示是否能向下滚动,false表示已经滚动到顶部
recyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
float y = 0;
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
y = motionEvent.getRawY();
break;
case MotionEvent.ACTION_UP:
float scrollY = motionEvent.getRawY();
if(Math.abs(scrollY-y)>20){
if(!recyclerView.canScrollVertically(1)){
gotoPager(CarCenterFragment.class,null);
}
}
break;
}
return false;
}
});