Android:禁止滚动的解决方法

这是纠结了我很久的一个问题,当我们在一个View里又嵌套一个View,但是两个View的内容超出范围后都会滚动的情况下,怎么保证内层的View固定不滚动。

一个Activity中有多个GridView,我给这几个GridView固定高度,但是不想让这几个小的GridView滚动。

XML语言: Layout/main.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<ScrollView>
<TableLayout>
<GridView android:id=“@+id/grid1”></GridView>
<GridView android:id=“@+id/grid2”></GridView>
<GridView android:id=“@+id/grid3”></GridView>
<GridView android:id=“@+id/grid4”></GridView>
</TableLayout>
</ScrollView>

类似于以上形式

但是不管是百度还是谷歌,我都没找到GridView有一种方法或者一个属性,直接设置滚动状态,只有一个可以设置滚动条是否可见,即使不可见,也是可以滚动的。于是想替代办法。后来查找英文资料的时候,发现一个很多View都有的方法:onTouchEvent()方法,这个方法可以判断你是点击,还是滑动,还是离开。于是想自己重写这个方法,但是不知道怎么重写GridView的方法,干脆直接新建一个类myGridView,继承GridView,重写这个方法。当点击或者离开时,myGridView调用父类的方法,当滑动时,什么都不干。思路就是这样。

新建myGridView类,重写onTouchEvent方法:

Java语言: myGridView

public class myGridView extends GridView {

public myGridView(Context context) {
super(context);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
//重写的onTouchEvent回调方法
switch(event.getAction()){
//按下
case MotionEvent.ACTION_DOWN:
System.out.println(“ACTION_DOWN”);
return super.onTouchEvent(event);
//滑动
case MotionEvent.ACTION_MOVE:
System.out.println(“ACTION_MOVE”);
break;
//离开
case MotionEvent.ACTION_UP:
System.out.println(“ACTION_UP”);
return super.onTouchEvent(event);
}
//注意:返回值是false
return false;
}
}

我相信大家一看就会明白的,但是要注意返回值要是false因为只有滑动动作的时候才break出来,然后返回,其他两种操作交给父类来进行正常的处理。这样,直接返回,什么都不会去做,当然也不会滚动了。(估计返回true也可)。

问题还没有解决,布局文件里面不能识别myGridView,所以动态添加myGridView,在这里我是加了一个LinearLayout,得到她的ID,在程序中建立myGridView对象,用LinearLayout的addView方法加进去。OK!

XML语言: Layout布局2
<?xml version=”1.0″ encoding=”utf-8″?>
<ScrollView>
<TableLayout>
<LinearLayout android:id=“@+id/ly1”></GridView>
<LinearLayout android:id=“@+id/ly2”></GridView>
<LinearLayout android:id=“@+id/ly3”></GridView>
<LinearLayout android:id=“@+id/ly4”></GridView>
</TableLayout>
</ScrollView>

添加GridView

Java语言: 加入myGridView
LinearLayout ly1 = (LinearLayout)findViewById(R.id.ly1);
LinearLayout ly2 = (LinearLayout)findViewById(R.id.ly2);
LinearLayout ly3 = (LinearLayout)findViewById(R.id.ly3);
LinearLayout ly4 = (LinearLayout)findViewById(R.id.ly4);

mGrid = new myGridView(this);
mGrid2 = new myGridView(this);
mGrid3 = new myGridView(this);
mGrid4 = new myGridView(this);

//Adapter自己去写
mGrid.setAdapter(adapter);
mGrid2.setAdapter(adapter2);
mGrid3.setAdapter(adapter3);
mGrid4.setAdapter(adapter4);

//设置一些myGridView的属性
mGrid.setColumnWidth(60);
mGrid.setHorizontalSpacing(5);
mGrid.setVerticalScrollBarEnabled(false);
mGrid.setNumColumns(GridView.AUTO_FIT);

//注意第二个参数
ly1.addView(mGrid,
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
ly2.addView(mGrid2,
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
ly3.addView(mGrid3,
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
ly4.addView(mGrid4,
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

中间肯定有一些需要自己写的东西,我只是把关键代码贴出来了。搞定,很高兴!!!
作者:刘钊

2条评论

  1. marine8888说道:

    可以在其parent view中重写dispatchTouchEvent(event)方法。
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    if(ev.getAction() == MotionEvent.ACTION_MOVE){
    return true;//forbid its child(gridview) to scroll
    }
    return super.dispatchTouchEvent(ev);
    }

    1. Liudroid说道:

      @marine8888 @marine8888: 嗯,你说的对,呵呵。这篇文章比较早了,有些地方不是很好。谢谢你,期待经常交流

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  • © 2010 知研片语
  • 京ICP备16042882号