关于ListView GridView 嵌套遇到的坑

前言

随着项目的需求及展示要求,一般ListView都会涉及到嵌套问题,本文就关于嵌套问题,集合平时开发遇到的坑,做一个介绍,祭奠我们遇到的坑!欢迎大家补充。


1.获取一个 ListView 的当前点击的 ItemView 。

public View getItemViewByPosition(int pos, AdapterView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (pos < firstListItemPosition || pos > lastListItemPosition) {
        return listView.getAdapter().getView(pos, null, listView);
    } else {
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

这个方法,如果有坑,欢迎大家留言讨论,尤其是ListView 有 HeaderView 的时候。比较稳妥的,我是采用嵌套方法,找到我要求的 view 的parentView,如下。

2.根据当前点击的 view 获取他的 ParentView,可以代替1.

比如我需要找到 v 的父控件,或者'爷爷'控件,我们只要知道父控件的 id,比如:R.id.ll_left,R.id.ll_right。

@Override
public boolean onLongClick(View v) {
    LogUtils.d("info", "View info:" + v.toString());

    View convertView = null;

    try {
        MessageView message = (MessageView) v.getTag();
        int position = messageList.indexOf(message);

        boolean isIncoming = message.getDirection() == Direction.INCOMING;
        convertView = findLinearLayoutViewByChild(v, isIncoming);

        if (convertView != null) {
            convertView.setTag(message);
            callBack.execute(position, convertView);
        }
    } catch (Exception e) {
        LogUtils.e("info", e.toString());
    }

    return true;
}

//方法
private View findLinearLayoutViewByChild(View v, boolean inComing) {
        View viewGroup = null;
        View res = null;
        View parent = null;
        parent = (View) v.getParent();
        if (v instanceof ViewGroup) {
            viewGroup = (ViewGroup) v;

            if (inComing) {
                res = viewGroup.findViewById(R.id.ll_left);
            } else {
                res = viewGroup.findViewById(R.id.ll_right);
            }

            if (res != null) {
                return res;
            } else {
                if (parent != null) {
                    return findLinearLayoutViewByChild((View) v.getParent(), inComing);
                } else {
                    return null;
                }

            }
        } else {
            if (parent != null) {
                return findLinearLayoutViewByChild((View) v.getParent(), inComing);
            } else {
                return null;
            }
        }
    }

3.ListView Item嵌套GridView ,GridView里面的空白处的长按事件不执行的解决方案。

相信大家一看就知道怎么解决的。

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

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

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

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

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

    // 用来处理是否为长按的Runnable
    private Runnable mLongClickRunnable = new Runnable() {
        @Override
        public void run() {
            performLongClick();
        }
    };

    int downX;
    int downY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            downX = (int) ev.getX();
            downY = (int) ev.getY();

            // 根据按下的X,Y坐标获取所点击item的position
            int position = pointToPosition(downX, downY);

            // 点击在 item 的位置
            if (position != AdapterView.INVALID_POSITION) {
                return super.dispatchTouchEvent(ev);
            }

            // 不是itemview的位置的时候,mLongClickRunnable
            postDelayed(mLongClickRunnable, ViewConfiguration.getLongPressTimeout());
            break;

        case MotionEvent.ACTION_MOVE:
            int moveX = (int) ev.getX();
            int moveY = (int) ev.getY();

            int movePosition = pointToPosition(moveX, moveY);
            // 如果我们在按下的空白区域内移动,只要不进入有item的区域我们就不移除 mRunnable
            if (movePosition != AdapterView.INVALID_POSITION) {
                removeCallbacks(mLongClickRunnable);
            }
            
            //如果在空白区域移动过多,我们移除空白区域的 mRunnable
            if (movePosition == AdapterView.INVALID_POSITION
                    && (Math.abs(moveX -downX)>ViewConfiguration.getTouchSlop()
                            || Math.abs(moveY -downY)>ViewConfiguration.getTouchSlop())) {
                removeCallbacks(mLongClickRunnable);
            }
            break;

        case MotionEvent.ACTION_UP:
            removeCallbacks(mLongClickRunnable);
            break;
        }
        return super.dispatchTouchEvent(ev);
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容