这是纠结了我很久的一个问题,当我们在一个View里又嵌套一个View,但是两个View的内容超出范围后都会滚动的情况下,怎么保证内层的View固定不滚动。
一个Activity中有多个GridView,我给这几个GridView固定高度,但是不想让这几个小的GridView滚动。
类似于以上形式
但是不管是百度还是谷歌,我都没找到GridView有一种方法或者一个属性,直接设置滚动状态,只有一个可以设置滚动条是否可见,即使不可见,也是可以滚动的。于是想替代办法。后来查找英文资料的时候,发现一个很多View都有的方法:onTouchEvent()方法,这个方法可以判断你是点击,还是滑动,还是离开。于是想自己重写这个方法,但是不知道怎么重写GridView的方法,干脆直接新建一个类myGridView,继承GridView,重写这个方法。当点击或者离开时,myGridView调用父类的方法,当滑动时,什么都不干。思路就是这样。
新建myGridView类,重写onTouchEvent方法:
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!
添加GridView
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));
中间肯定有一些需要自己写的东西,我只是把关键代码贴出来了。搞定,很高兴!!!
作者:刘钊