如何解决listview与scrollview的滑动冲突

参考文献:
《android 事件处理机制之requestDisallowInterceptTouchEvent》:
https://blog.csdn.net/chaihuasong/article/details/17499799

一、问题:
当布局使用了scrollview时,整个布局时可以上下滑动了,但是其中包裹的listview却会卡顿住不能滑动

二、原因:
当有多个层级的View时,父控件scrollview内的权限会禁止子控件获取焦点滑动。
当手指触摸到屏幕时,系统会调用相应View的onTouchEvent,并传入一系列的action。View的onTouchEvent接收到某个touch action后,会有两种返回方式:return truereturn false
return true会告诉系统当前的View需要处理这次的touch事件,以后的系统发出的ACTION_MOVE,ACTION_UP还是需要继续监听并接收的,而且这次的action已经被处理掉了,父层的View是不可能出发onTouchEvent了。所以每一个action最多只能有一个onTouchEvent接口返回true。
return false,便会通知系统,当前View不关心这一次的touch事件,此时这个action会传向父级,调用父级View的onTouchEvent。

三、解决方案:
理解了上述原理,我们就可以监听listview的触摸事件,当触摸到listview并滑动时,重写scrollview里的权限,让父控件的焦点失效。

四、code

import android.view.View;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ListView;
import java.util.ArrayList;
import android.widget.ScrollView;
import android.view.MotionEvent;

public class MainActivity extends Activity {

    private ListView list_photo;  
    private BaseAdapter mAdapter = null;
    private ArrayList<Lcon> mData_list;
    private BaseAdapter mAdapter_list = null;
    private ScrollView scrollView;  //Java中所有的变量在使用前必须声明,包括各种控件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//-----------------------------------LISTVIEW-----------------------------------------
        list_photo = (ListView) findViewById(R.id.list_photo);
        ArrayList<Lcon> mData_list = new ArrayList<Lcon>();
        mData_list.add(new Lcon(R.mipmap.lista,
                "货币基金优等生","1.742%","收益稳健,灵活申赎","七日年化","由银行提供服务"));
        mData_list.add(new Lcon(R.mipmap.listb,
                "保险无忧金","10.220%","PR1-低风险","七日年化","由银行提供服务"));
        MyAdapter<Lcon> mAdapter_list = new MyAdapter<Lcon>(mData_list,R.layout.item_list_icon) {
            @Override
            public void bindView(ViewHolder holder, Lcon obj) {
                holder.setImageResource(R.id.list_img,obj.getiId());
                holder.setText(R.id.list_txt1,obj.getiName1());
                holder.setText(R.id.list_txt2,obj.getiName2());
                holder.setText(R.id.list_txt3,obj.getiName3());
                holder.setText(R.id.list_txt4,obj.getiName4());
                holder.setText(R.id.list_txt5,obj.getiName5());
            }
        };
        list_photo.setAdapter(mAdapter_list);
//----------------------解决listview与scrollview的滑动冲突-------------------------------
        //非常重要!必须在main文件里引用整个scrollview,否则点击listview时会因定位不到具体布局的id闪退
        scrollView = (ScrollView)findViewById(R.id.scrollView);
        list_photo.setOnTouchListener(new View.OnTouchListener() {  //监听listview的触摸点击事件
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    // 当手指触摸listview时,让父控件焦点失效,不能滚动
                    case MotionEvent.ACTION_DOWN:
                        scrollView.requestDisallowInterceptTouchEvent(true);
                    case MotionEvent.ACTION_MOVE:
                        break;
                    case MotionEvent.ACTION_CANCEL:
                        // 当手指松开时,让父控件重新获取焦点
                        scrollView.requestDisallowInterceptTouchEvent(false);
                        break;
                }
                return false;
            }
        });
全部评论

相关推荐

咦哟,从去年八月份开始长跑,两处实习转正都失败了,风雨飘摇,终于拿到offer了更新一下面试记录:秋招:多部门反复面试然后挂掉然后复活,具体问了啥已经忘了,只是被反复煎炸,直至焦香😋春招:base北京抖音hr打来电话说再次复活,准备面试,gogogo北京抖音一面:六道笔试题:1.promise顺序2.定义域问题3.flat展开4.并发请求5.岛屿数量算法(力扣)深度,广度都写6.忘记了,好像也是算法,难度中等其他问题多是框架底层设计,实习项目重难点~~~秒过😇北京抖音二面:三道笔试题:(为什么只有三道是因为第三道没做出来,卡住了)1.中等难度算法(忘记啥题了,应该是个数组的)2.认识js的继承本质(手写继承模式,深入js的面相对象开发)3.手写vue的响应式(卡在了watch,导致挂掉)---后知后觉是我的注册副作用函数写得有问题,有点紧张了其他题目多是项目拷打,项目亮点,对实习项目的贡献~~~第二天,挂,but立马复活转战深圳客服当天约面深圳客服一面:六道笔试题,由于面过太多次字节,面试官叫我直接写,不用讲,快些写完😋,具体都是些继承,深拷贝(注意对数组对象分开处理,深层次对象,循环引用),加中等难度算法题~~~秒过深圳客服二面:口诉八股大战:大概囊括网络,浏览器渲染原理,动画优化,时间循环,任务队列等等(你能想到的简单八股通通拉出来鞭尸😋)算法题:笔试题6道:1:找出数组内重复的数,arr[0]-arr[n]内的数大小为[1-n],例如[1,2,2,3,3]返回[2,3],要求o(n),且不使用任何额外空间(做到了o(n),空间方面欠佳,给面试官说进入下一题,做不来了)2:原滋原味的继承(所以继承真滴很重要)3:力扣股票购买时机难度中等其他滴也忘记了,因为拿到offer后鼠鼠一下子就落地了,脑子自动过滤掉可能会攻击鼠鼠的记忆😷~~~秒过深圳客服三面:项目大战参与战斗的人员有:成员1:表单封装及其底层原理,使用成本的优化,声明式表单成员2:公司内部库生命周期管理成员3:第三方库和内部库冲突如何源码断点调试并打补丁解决成员4:埋点的艺术成员5:线上项目捷报频传如何查出内鬼成员6:大文件分片的风流趣事成员7:设计模式对对碰成员8:我构建hooks应对经理的新增的小需求的故事可能项目回答的比较流利,笔试题3道,都很简单,相信大家应该都可以手拿把掐😇~~~过过过无hr面后续煎熬等待几天直接hr打电话发offer了,希望大家也可以拿到自己心仪的offer
法力无边年:牛哇,你真是准备得充分,我对你没有嫉妒,都是实打实付出
查看19道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务