最近项目要实现ScrollView中嵌套广告轮播图+RecyleView卡片布局,并且RecyleView按照header和内容的排列样式,因为RecyleView的可扩展性很强,所以我毫无疑问的选择了它,而且让RecyleView实现了可拖拽的效果,

最后我再加上了下拉刷新的效果(这里我用的下拉刷新控件是三方的SmartRefreshLayout)。记得刚开始实现这个效果的时候还是十分的得心印手。可是当我测试的时候,发现RecyleView的子item的拖拽效果并不流畅,起初我以

为是由于RecyleView和ScrollView的滑动冲突导致的,可是慢慢我自己重新写了个demo,逐步调试,发现肯定是下拉刷新控件和ScrollView的原因造成的,于是对症下药,终于找到了解决的办法,这里将我的答案记录下来,为了

后面其他的人遇到和我一样的问题,避免他们走很多的弯路,希望会对他们有所帮助,当然把自己遇到问题和解决问题的办法都记录下来,这对自己来说也是一种成长。如果有其他更好的思路,希望给我留言,谢谢。

 解决办法一:

        在布局页面中把ScrollView控件换成NestedScrollView控件:

        对NestedScrollView的详解:http://www.cnblogs.com/skytwo/p/4613912.html

    
  <android.support.v4.widget.NestedScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent">..............</android.support.v4.widget.NestedScrollView>

以下是简单demo:


MainActivity:用底部BottomNavigationBar,实现viewpager和fragment连用
代码:
public class MainActivity extends AppCompatActivity implements BottomNavigationBar.OnTabSelectedListener,ViewPager.OnPageChangeListener{private ViewPager viewPager;private BottomNavigationBar bottomNavigationBar;//存放fragment的集合private Fragment[] fragments;//切换不同fragment用的下标private int index;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initBottomNavigationBar();initViewPager();}//初始化底部导航菜单private void initBottomNavigationBar() {bottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar);bottomNavigationBar.setTabSelectedListener(this);bottomNavigationBar.clearAll();bottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);bottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC);bottomNavigationBar.addItem(new BottomNavigationItem(R.drawable.ic_launcher,"主页").setInactiveIconResource(R.drawable.ic_launcher).setActiveColorResource(R.color.colorPrimaryDark)).addItem(new BottomNavigationItem(R.drawable.ic_launcher,"单据").setInactiveIconResource(R.drawable.ic_launcher).setActiveColorResource(R.color.colorPrimaryDark)).addItem(new BottomNavigationItem(R.drawable.ic_launcher, "审核").setInactiveIconResource(R.drawable.ic_launcher).setActiveColorResource(R.color.colorPrimaryDark)).addItem(new BottomNavigationItem(R.drawable.ic_launcher, "报表").setInactiveIconResource(R.drawable.ic_launcher).setActiveColorResource(R.color.colorPrimaryDark)).addItem(new BottomNavigationItem(R.drawable.ic_launcher,"设置").setInactiveIconResource(R.drawable.ic_launcher).setActiveColorResource(R.color.colorPrimaryDark)).initialise();}//初始化viewpagerprivate void initViewPager() {viewPager = (ViewPager) findViewById(R.id.view_pager);fragments = new Fragment[5];fragments[0]=new FragOne();fragments[1]=new FragTwo();fragments[2]=new FragThree();fragments[3]=new FragFour();fragments[4]=new FragFive();viewPager.setOffscreenPageLimit(4);viewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager(), fragments));viewPager.addOnPageChangeListener(this);viewPager.setCurrentItem(0);}@Overridepublic void onTabSelected(int position) {viewPager.setCurrentItem(position);}@Overridepublic void onTabUnselected(int position) {}@Overridepublic void onTabReselected(int position) {}@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int i) {bottomNavigationBar.selectTab(i);this.index = i;}@Overridepublic void onPageScrollStateChanged(int state) {}class SectionsPagerAdapter extends FragmentPagerAdapter {Fragment fragments[]=new Fragment[4];public SectionsPagerAdapter(FragmentManager fm, Fragment fragments[]) {super(fm);this.fragments = fragments;}@Overridepublic Fragment getItem(int position) {return fragments[position];}@Overridepublic int getCount() {return fragments.length;}}
}

MainActity布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.admin.demo.MainActivity"><android.support.v4.view.ViewPagerandroid:id="@+id/view_pager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><com.ashokvarma.bottomnavigation.BottomNavigationBarandroid:id="@+id/bottom_navigation_bar"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom"/></LinearLayout>

主fragment:实现下拉刷新、上拉加载、RecyleView拖拽等各种效果的fragment
public class FragOne extends Fragment implements MyItemTouchCallback.OnDragListener {private List<String> list = new ArrayList<String>();private View parent;//显示模块的recyleviewprivate RecyclerView mRecyclerView;//可拖动模块的帮助类private ItemTouchHelper itemTouchHelper;//适配器private RecyleViewAdapter mRecyclerAdapter;//声明刷新控件private SmartRefreshLayout srf;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {parent = inflater.inflate(R.layout.frag_one, container, false);initView();return parent;}private void initView() {for (int i = 0; i < 100; i++) {list.add(i + "");}mRecyclerView = (RecyclerView) parent.findViewById(recyclerView);// 设置添加删除item的时候的动画效果mRecyclerView.setItemAnimator(new DefaultItemAnimator());GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 4);gridLayoutManager.setSmoothScrollbarEnabled(true);gridLayoutManager.setAutoMeasureEnabled(true);mRecyclerView.setLayoutManager(gridLayoutManager);mRecyclerView.setHasFixedSize(true);mRecyclerView.setNestedScrollingEnabled(false);// 设置适配器mRecyclerAdapter = new RecyleViewAdapter(list);itemTouchHelper = new ItemTouchHelper(new MyItemTouchCallback(mRecyclerAdapter).setOnDragListener(this));itemTouchHelper.attachToRecyclerView(mRecyclerView);mRecyclerView.setAdapter(mRecyclerAdapter);mRecyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(mRecyclerView) {@Overridepublic void onLongClick(RecyclerView.ViewHolder vh) {itemTouchHelper.startDrag(vh);VibratorUtil.Vibrate(getActivity(), 70);   //震动70ms
            }@Overridepublic void onItemClick(RecyclerView.ViewHolder vh) {super.onItemClick(vh);}});srf = (SmartRefreshLayout) parent.findViewById(R.id.refresh);srf.setDefaultRefreshHeaderCreater(new DefaultRefreshHeaderCreater() {@Overridepublic RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {return new ClassicsHeader(context);//指定为经典Header,默认是 贝塞尔雷达Header
            }});srf.setOnRefreshListener(new OnRefreshListener() {@Overridepublic void onRefresh(RefreshLayout refreshlayout) {srf.postDelayed(new Runnable() {@Overridepublic void run() {mRecyclerAdapter.notifyDataSetChanged();srf.finishRefresh();Toast.makeText(getActivity(), "刷新成功", Toast.LENGTH_SHORT).show();}}, 3000);}});srf.setEnableLoadmore(false);//屏蔽掉上拉加载的效果
}@Overridepublic void onFinishDrag() {}class RecyleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements MyItemTouchCallback.ItemTouchAdapter {private List<String> mData;public RecyleViewAdapter(List<String> data) {mData = data;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new TestViewHolder(View.inflate(parent.getContext(), R.layout.item_test, null));}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {TestViewHolder tHolder = (TestViewHolder) holder;tHolder.tv.setText(mData.get(position));}@Overridepublic int getItemCount() {return mData == null ? 0 : mData.size();}@Overridepublic void onMove(int fromPosition, int toPosition) {if (fromPosition < toPosition) {for (int i = fromPosition; i < toPosition; i++) {Collections.swap(mData, i, i + 1);}} else {for (int i = fromPosition; i > toPosition; i--) {Collections.swap(mData, i, i - 1);}}notifyItemMoved(fromPosition, toPosition);}@Overridepublic void onSwiped(int position) {mData.remove(position);notifyItemRemoved(position);}private class TestViewHolder extends RecyclerView.ViewHolder {TextView tv;public TestViewHolder(View itemView) {super(itemView);tv = (TextView) itemView.findViewById(R.id.tv);}}}

主fragment布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.scwang.smartrefresh.layout.SmartRefreshLayoutandroid:id="@+id/refresh"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v4.widget.NestedScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/test" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:descendantFocusability="blocksDescendants"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView></RelativeLayout></LinearLayout></android.support.v4.widget.NestedScrollView></com.scwang.smartrefresh.layout.SmartRefreshLayout></LinearLayout>

RecyleView实现可拖拽效果的帮助类:
MyItemTouchCallback :
public class MyItemTouchCallback extends ItemTouchHelper.Callback {private ItemTouchAdapter itemTouchAdapter;public MyItemTouchCallback(ItemTouchAdapter itemTouchAdapter){this.itemTouchAdapter = itemTouchAdapter;}@Overridepublic boolean isLongPressDragEnabled() {return false;}@Overridepublic boolean isItemViewSwipeEnabled() {return true;}@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;final int swipeFlags = 0;return makeMovementFlags(dragFlags, swipeFlags);} else {final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;final int swipeFlags = 0;return makeMovementFlags(dragFlags, swipeFlags);}}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {int fromPosition = viewHolder.getAdapterPosition();//得到拖动ViewHolder的positionint toPosition = target.getAdapterPosition();//得到目标ViewHolder的position
        itemTouchAdapter.onMove(fromPosition,toPosition);return true;}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {int position = viewHolder.getAdapterPosition();itemTouchAdapter.onSwiped(position);}@Overridepublic void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {//滑动时改变Item的透明度final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth();viewHolder.itemView.setAlpha(alpha);viewHolder.itemView.setTranslationX(dX);} else {super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);}}@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {if (background == null && bkcolor == -1) {Drawable drawable = viewHolder.itemView.getBackground();if (drawable == null) {bkcolor = 0;} else {background = drawable;}}viewHolder.itemView.setBackgroundColor(Color.LTGRAY);}super.onSelectedChanged(viewHolder, actionState);}@Overridepublic void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {super.clearView(recyclerView, viewHolder);viewHolder.itemView.setAlpha(1.0f);if (background != null) viewHolder.itemView.setBackgroundDrawable(background);if (bkcolor != -1) viewHolder.itemView.setBackgroundColor(bkcolor);//viewHolder.itemView.setBackgroundColor(0);if (onDragListener!=null){onDragListener.onFinishDrag();}}private Drawable background = null;private int bkcolor = -1;private OnDragListener onDragListener;public MyItemTouchCallback setOnDragListener(OnDragListener onDragListener) {this.onDragListener = onDragListener;return this;}public interface OnDragListener{void onFinishDrag();}public interface ItemTouchAdapter {void onMove(int fromPosition, int toPosition);void onSwiped(int position);}
}

OnRecyclerItemClickListener:
public class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener{private GestureDetectorCompat mGestureDetector;private RecyclerView recyclerView;public OnRecyclerItemClickListener(RecyclerView recyclerView){this.recyclerView = recyclerView;mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),new ItemTouchHelperGestureListener());}@Overridepublic boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {mGestureDetector.onTouchEvent(e);return false;}@Overridepublic void onTouchEvent(RecyclerView rv, MotionEvent e) {mGestureDetector.onTouchEvent(e);}@Overridepublic void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {@Overridepublic boolean onSingleTapUp(MotionEvent e) {View child = recyclerView.findChildViewUnder(e.getX(), e.getY());if (child!=null) {RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);onItemClick(vh);}return true;}@Overridepublic void onLongPress(MotionEvent e) {View child = recyclerView.findChildViewUnder(e.getX(), e.getY());if (child!=null) {RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);onLongClick(vh);}}}public void onLongClick(RecyclerView.ViewHolder vh){}public void onItemClick(RecyclerView.ViewHolder vh){}
}

 VibratorUtil(手机振动工具类)
/*** 手机震动工具类* @author Administrator* 使用必须添加权限:<uses-permission android:name="android.permission.VIBRATE" />*/
public class VibratorUtil {/*** final Activity activity  :调用该方法的Activity实例* long milliseconds :震动的时长,单位是毫秒* long[] pattern  :自定义震动模式 。数组中数字的含义依次是[静止时长,震动时长,静止时长,震动时长。。。]时长的单位是毫秒* boolean isRepeat : 是否反复震动,如果是true,反复震动,如果是false,只震动一次*/public static void Vibrate(final Activity activity, long milliseconds) {Vibrator vib = (Vibrator) activity.getSystemService(Service.VIBRATOR_SERVICE);vib.vibrate(milliseconds);}public static void Vibrate(final Activity activity, long[] pattern, boolean isRepeat) {Vibrator vib = (Vibrator) activity.getSystemService(Service.VIBRATOR_SERVICE);vib.vibrate(pattern, isRepeat ? 1 : -1);}}

Android 解决下拉刷新控件和ScrollVIew的滑动冲突问题。相关推荐

  1. Android SwipeRefreshLayout下拉刷新控件源码简单分析

    咱们在做Android APP开发的时候经常碰到有下拉刷新和上拉加载跟多的需求,这篇文章咱们先说说下来刷新,咱们就以google的原生的下拉刷新控件SwipeRefreshLayout来看看大概的实现 ...

  2. android禁止下拉刷新,Android开发之无痕过渡下拉刷新控件的实现思路详解

    相信大家已经对下拉刷新熟悉得不能再熟悉了,市面上的下拉刷新琳琅满目,然而有很多在我看来略有缺陷,接下来我将说明一下存在的缺陷问题,然后提供一种思路来解决这一缺陷,废话不多说!往下看嘞! 1.市面一些下 ...

  3. 一种无痕过渡下拉刷新控件的实现思路

    一种无痕过渡下拉刷新控件的实现思路 相信大家已经对下拉刷新熟悉得不能再熟悉了,市面上的下拉刷新琳琅满目,然而有很多在我看来略有缺陷,接下来我将说明一下存在的缺陷问题,然后提供一种思路来解决这一缺陷,废 ...

  4. Android SwipeRefreshLayout 官方下拉刷新控件介绍

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 下面App基本都有下拉刷新的功能,以前基本都使用XListView ...

  5. android 下拉刷新 组件,android系统自带下拉刷新控件的实现

    android系统自带的下拉刷新控件SwipeRefreshLayout位于android.support.v4.widget包下,实现步骤如下: 1.在布局文件中添加该控件,该控件一般作为父控件,而 ...

  6. pb自定义控件 事件_Android WebView与下拉刷新控件滑动冲突的解决方法

    使用WebView时一般会在外层使用下拉刷新控件如(SwipeRefreshLayout).但是测试时会发现网页无法上拉,往上滑动就会触发下拉刷新控件的refresh事件.所以这里记录一下解决该问题的 ...

  7. 打造Android微信朋友圈下拉刷新控件

    打造Android微信朋友圈下拉刷新控件> 转载于:https://www.cnblogs.com/zhujiabin/p/5707789.html

  8. android多个下拉控件,Android实现支持所有View的通用的下拉刷新控件

    下拉刷新对于一个app来说是必不可少的一个功能,在早期大多数使用的是chrisbanes的PullToRefresh,或是修改自该框架的其他库.而到现在已经有了更多的选择,github上还是有很多体验 ...

  9. Android 怎么实现支持所有View的通用的下拉刷新控件

    转载请标明出处: http://blog.csdn.net/u010386612/article/details/51372696 本文出自:[AItsuki的博客] 下拉刷新对于一个app来说是必不 ...

最新文章

  1. 高危Windows 0day漏洞:看一眼就中毒
  2. 洛谷P1832 A+B Problem(再升级)
  3. NMS 非极大值抑制
  4. 力扣:1两数之和(python)-------->双向取值
  5. 【Linux】一步一步学Linux——zipinfo命令(69)
  6. 2010经典句句 学会了以后你的嘴巴会很流利 (转)
  7. php 随机钱数,PHP 仿微信红包金额随机
  8. scala与java的区别_Scala学习笔记及与Java不同之处总结
  9. php求链表中位数,先给伸手党的php链表遍历求和
  10. css修改select选择框option被选中的背景颜色_这 16 个 CSS 伪类,助你提升布局效率!
  11. 中国农业机械化行业市场供需与战略研究报告
  12. 【Hadoop】用web查看hadoop运行状态
  13. 编程基本功:以输入法为例,谈谈测试案例的设计
  14. c语言花朵源代码,C语言花朵代码.doc
  15. 各类文件的文件头标志
  16. 【Proteus仿真】Arduino UNO步进电机驱动示例
  17. 用matlab实现灰色预测gm11模型,用MATLAB实现灰色预测GM11模型
  18. Excel文件密码破解小工具
  19. 图像质量评价方法PSNR+SSIM评估指标SROCC,PLCC
  20. 基于 qiankun 的微前端最佳实践(万字长文) - 从 0 到 1 篇

热门文章

  1. CentOS 6.0 + Zabbix 1.8.5 服务器端安装
  2. 勒索团伙正奔向 SonicWall 设备
  3. 朝鲜 APT37被指发动软件供应链攻击,瞄准股票投资人
  4. Pwn2Own 2020 曝出的Linux 内核漏洞已修复
  5. “心脏出血”后,OpenSSL 起死回生靠什么?
  6. B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树
  7. 广度优先搜索算法(Breath-first Search)是如何搜索一张图的?
  8. Linux入门:usermod - 修改用户帐户信息
  9. shell之任务控制
  10. 使用sersync实现多台服务器实时同步文件