Android最简单的GridView嵌套GridView,解决滑动冲突问题

来源:互联网 发布:淘宝上靠谱的高仿鞋店 编辑:程序博客网 时间:2024/05/23 00:06

昨天一个朋友问我,一个问题,gridview嵌套gridview,且内部的gridview不显示完,还能滑动,外部的也可以滑动,怎么实现。 思考后查了资料,这个需要考虑到安卓事件的分发机制,具体就不细说,自己可以去看看,还借鉴了这篇文章给的思路:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=321726&page=1#pid3558454。


话不多说,先看看要实现的效果图是什么样子的。





第一张:外面白色间隔的是外层gridview,内部的数字是内部gridview的每一个item(我只显示6个,实际有10个),来看看滑动后是什么样子的。


第二张:就是内部滑动后的样子。


具体说说实现方法:

首先自定义两个Gridview,外层MyGridView,内层的DragGridView。

重写内层MyGridView的onInterceptTouchEvent方法。 MyGridView类如下:


import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.GridView;

public class MyGridView extends GridView {
    
    private DragGridView dgView ;
    private boolean isDraged = true;

    public MyGridView(Context context) {
        super(context);
    }
    
    public MyGridView(Context context, AttributeSet attrs){
        super(context ,  attrs);
    }

    public MyGridView(Context context, AttributeSet attrs, int defStyle){
        super(context ,  attrs,defStyle);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        // 正在拖拽状态的不要处理,直接透传给DragGridView;
        if (getDgView() != null && getDgView().isDraged()) {
            return false;
        }
        
        return super.onInterceptTouchEvent(event);
    }

    
    public boolean isDraged() {
        return isDraged;
    }

    public void setDraged(boolean isDraged) {
        this.isDraged = isDraged;
    }

    public DragGridView getDgView() {
        return dgView;
    }

    public void setDgView(DragGridView dgView) {
        this.dgView = dgView;
    }
   

}


外部DragGridView添加了一个方法,代码如下:


import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;

public class DragGridView extends GridView {
    private boolean flag_isDraged = false;

    
    public DragGridView(Context context) {
        super(context);
    }
    
    public DragGridView(Context context, AttributeSet attrs){
        super(context ,  attrs);
    }

    public DragGridView(Context context, AttributeSet attrs, int defStyle){
        super(context ,  attrs,defStyle);
    }
    
    public boolean isDraged() {
        
        return isFlag_isDraged();
    }
    
    public boolean isFlag_isDraged() {
        return flag_isDraged;
    }

    public void setFlag_isDraged(boolean flag_isDraged) {
        this.flag_isDraged = flag_isDraged;
    }
    
    
}


isDraged方法是用来判断内部gridview有没有在滑动的。在MyGridView有使用到。


接下来就是在内部外部MyGridView的adapter内写DragGridView的setOnItemLongClickListener长点击事件,修改DragGridView的滑动状态。


older.gridView.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Log.i("", "111111111111111");
                myGridView.setDgView(dragGridView);
                dragGridView.setFlag_isDraged(true);
                return false;
            }
        });


在setOnTouchListener方法中取消滑动状态。


holder.gridView.setOnTouchListener(new OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                    Log.i("", "1111111--1111111");
                    dragGridView.setFlag_isDraged(false);
                    break;

                def  :
                    break;
                }
                return false;
            }
        })



主要代码都在上面了,如果想下载 完整demo的可以点击下面的链接:


下载完整demo链接:http://download.csdn.net/detail/u013790519/8528405


转载时请说明,谢谢。

0 0
原创粉丝点击