Android:禁用列表视图内的元素滚动

Posted

技术标签:

【中文标题】Android:禁用列表视图内的元素滚动【英文标题】:Android: Disable scolling on an element, inside a listview 【发布时间】:2020-01-06 05:57:35 【问题描述】:

喂!

我在活动中有一个列表视图。 在列表视图中有更多的 LinealLayout。其中一个有两个imageview。对于这两个 imageView 都设置了 ontuchlistener。如果用户尝试滚动该布局,是否可以不滚动列表视图?我可以以某种方式阻止列表视图滚动吗?

base_activity.xml:

 <ListView
    android:id="@+id/items"
    style="@style/ListViewStyle"
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:layout_weight="1"></ListView>

item.xml:

<LinearLayout>

    <LinearLayout>
    </LinearLayout>

    <LinearLayout>
            <LinearLayout>
            </LinearLayout>


            <LinearLayout
                android:id="@+id/layout_with_image">

                <ImageView />

                <ImageView />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

    <LinearLayout>
    </LinearLayout>
</LinearLayout>

itemAdapter.java:

       imgButton1.setOnTouchListener(new View.OnTouchListener() 
            @Override
            public boolean onTouch(View v, MotionEvent event) 
                if (event.getAction() == MotionEvent.ACTION_MOVE) 
                    // Ignore move events
                    return false;
                
                if (event.getAction()== MotionEvent.ACTION_DOWN)
                    doPressDown(1, orderItem);
                
                else if (event.getAction()== MotionEvent.ACTION_UP)
                    doPressRelease();
                
                return true;
            
        );

        imgButton1.setOnTouchListener(new View.OnTouchListener() 
            @Override
            public boolean onTouch(View v, MotionEvent event) 
                if (event.getAction()== MotionEvent.ACTION_DOWN)
                    doPressDown(-1, orderItem);
                
                else if (event.getAction()== MotionEvent.ACTION_UP)
                    doPressRelease();
                
                return true;
            
        );

【问题讨论】:

【参考方案1】:

如果触摸事件等于ACTION_MOVE,您可以覆盖onTouch 以使列表视图返回true,从而禁用滚动运动。

listView.setOnTouchListener(new OnTouchListener() 
    public boolean onTouch(View v, MotionEvent event) 
        // Create a boolean variable 'scrollable' that can be toggled true/false
        if (!scrollable)
            return (MotionEvent.ACTION_MOVE.equals(event.getAction()));
        else
            return false;
    
);

另一个选项是禁用列表视图,但是,这也会禁用行选择:

listView.setEnabled(false);

【讨论】:

【参考方案2】:

是的,这可以通过禁止拦截父视图的触摸事件来实现。要禁止,请使用视图组的requestDisallowInterceptTouchEvent 方法。如;

anyView.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View view) 
        view.getParent().requestDisallowInterceptTouchEvent(true);
    
);

【讨论】:

getParent 有点复杂,所以我使用接口访问scrollView。 requestDisallowInterceptionTouchEvent() 方法很有用,谢谢!

以上是关于Android:禁用列表视图内的元素滚动的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用特定视图内的滚动?

在我的 android 应用程序中滚动列表视图时,数据正在消失。我在片段中使用列表视图

滚动视图中的 Android 列表视图

UIScrollView 内的 UIWebView 并滚动到 Web 视图中的选定字段

为啥滚动时列表视图项目内的图像视图会消失?

禁用列表视图中的滚动