可点击的Gridview

我们知道Gridview不能设置onClickListener和onLongClickListener,当GridView中出现了Blank cell,有时需要响应click事件,没有API可以调用。

AbsListView中的pointToPositon方法可以返回某个点对应的adapter中的数据position,当返回-1时,说明该点不在可见点item上,为空白区域。利用这个方法在dispatchTouchEvent中设置回调,可以解决这个问题。

以下是我实现的可以增加了onClickListener 和onLongClickListener的Gridview,有需要的可以参考一下:

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

public class ClickableGridView extends GridView {

    public ClickableGridView(Context context){
        super(context);
    }
    public ClickableGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public ClickableGridView(Context context, AttributeSet attrs,  int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private OnNoItemClickListener clickListener;
    private OnNoItemLongClickListener longClickListener;
    private boolean mHasPerformedLongPress = false;
    private boolean isPressed;
    private CheckForLongPress checkForLongPress;

    public interface OnNoItemClickListener {
        public void onNoItemClick();
    }

    public interface OnNoItemLongClickListener{
        public void onNoItemLongClick();
    }

    public void setOnNoItemClickListener(OnNoItemClickListener listener) {
        this.clickListener = listener;
    }

    public void setOnNoItemLongClickListener(OnNoItemLongClickListener longClickListener) {
        this.longClickListener = longClickListener;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        // The pointToPosition() method returns -1 if the touch event
        // occurs outside of a child View.
        if (pointToPosition((int) event.getX(), (int) event.getY()) == -1) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    isPressed = true;
                    mHasPerformedLongPress = false;
                    if(checkForLongPress == null){
                        checkForLongPress = new CheckForLongPress();
                    }
                    postDelayed(checkForLongPress, ViewConfiguration.getLongPressTimeout());
                    break;
                case MotionEvent.ACTION_UP:
                    if(!mHasPerformedLongPress){
                        removeCallbacks(checkForLongPress);
                        if(clickListener != null){
                            clickListener.onNoItemClick();
                        }
                    }else{
                        mHasPerformedLongPress = false;
                    }
                    isPressed = false;
                    break;
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_MOVE:
                default:
                    removeCallbacks(checkForLongPress);
                    isPressed = false;
                    break;
            }
        }
        return super.dispatchTouchEvent(event);
    }
    private final class CheckForLongPress implements Runnable {

        @Override
        public void run() {
            if (isPressed){
                if (longClickListener != null) {
                    longClickListener.onNoItemLongClick();
                    mHasPerformedLongPress = true;
                }
            }
        }
    }
}
时间: 2024-11-06 03:26:46

可点击的Gridview的相关文章

点击GridView中TextBox弹出输入对话层,输入内容反传回先前点击的TextBox中(Jquery获取GridView中TextBox的ID)

项目中,由于用户反映说:GridView表中的输入框太小,不方便输入,特别是在输入内容多的时候.问能不能点击GridView中输入框的时候能弹出一个大的内容输入对话框. 介于用户的要求,我就开始修改. 先想到的就是我用Jquery在GridView中TextBox上添加一个focus焦点捕捉事件,当点击时触犯弹出内容输入框. 然后就是当输入完毕的操作了,我又使用内容输入框(其实也是一个TextBox)的焦点失去事件(blur),在该事件中先把值反馈回先前点击的GridView中的那个TextBo

[转]Android网格视图(GridView)

GridView的一些属性: 1.android:numColumns=”auto_fit”   //GridView的列数设置为自动,也可以设置成2.3.4…… 2.android:columnWidth=”90dp "       //每列的宽度,也就是Item的宽度 3.android:stretchMode=”columnWidth"//缩放与列宽大小同步 4.android:verticalSpacing=”10dp”          //两行之间的边距 5.android

listview 模仿用户点击事件。

正确的方法 gvFlow.performItemClick(gvFlow.getChildAt(0),0,gvFlow.getAdapter().getItemId(0)); gvFlow.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id)

可以拖动交换item位置的GridView

欢迎关注Android技术分享公众号(小红人). 这篇文章是基于夏安明写的一个可以移动item的Demo改写的,因为原代码有一些BUG,比如adapter不能使用ViewHolder优化(这个问题应该是最大的问题)再比如不能使用上下拉刷新功能(这个是我额外添加的功能,不知道的可以去看看开源中国手机客户端的便签功能) 在Android开发中,我们常常用到ListView和GridView,而有的时候系统的ListView,GridView并不能满足我们的需求,所以我们需要自己定义一个ListVie

一个可以拖动的自定义Gridview代码

这个可以拖动的gridview继承于gridview,所以,用法和gridview一样, 代码如下: public class DragGridView extends GridView { private long dragResponseMS = 700; // item长按响应的时间 private int mDragPosition;// 正在拖拽的position private boolean isDrag = false; // 是否可以拖拽,用于控件内部逻辑实现 private

Android 高级UI设计笔记02:可以拖动交换item位置的GridView

1. 首先我们明白GridView拖拽的思路: (1)根据手指按下的X,Y坐标来获取我们在GridView上面点击的item. (2)手指按下的时候使用Handler和Runnable来实现一个定时器,假如定时时间为1000毫秒,在1000毫秒内,如果手指抬起了移除定时器,没有抬起并且手指点击在GridView的item所在的区域,则表示我们长按了GridView的item. (3)如果我们长按了item则隐藏item,然后使用WindowManager来添加一个item的镜像在屏幕用来代替刚刚

GridView 使用详解

极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: GridView 主要用法 GridView 使用案例 GridView 跟ListView 很类似,Listview 主要以列表形式显示数据,GridView 则是以网格形式显示数据,掌握ListView 使用方法后,会很轻松的掌握GridView的使用方法. GridView 简介 继

安卓项目开发实战(2)--星座展示12宫格

好多日子没有写安卓了,今天继续我未完成的安卓项目.今天主要实现星座展示的12宫格效果. 1.星座图片 找好12星座的图片,参见工程代码下面的res/drawable目录 2.星座枚举类 建立这个枚举类是很有必要的,可以使我们 的代码更加清晰,同时避免了魔法数字的情况. 枚举类的代码如下: package com.liuc.constatntEnum; import com.liuc.R; /** * 星座枚举 * * @author Administrator * */ public enum

手机卫士02_gridView,statelist.ui相关

1.1 新控件 GridView 类似ListView,但是可以指定每一行的列数 GridView和ListView都继承ABsListView. 属性:numColums=”2”//每一行的列数 使用方式可以参考ListView,需要setAdapter(adapter).设置适配器 在adapter中最重要的方法,getCount()//几个条目和getView()//具体效果 要注意的是getCount()返回的是总的条目数,而不是行数. GridView相当于是把条目总数除以行数这样的形