在ListView中嵌套EditText,EditText内容过多需要滚动的问题

来源:互联网 发布:大数据属于哪个专业 编辑:程序博客网 时间:2024/05/18 04:03

最近在做项目,需要在ListView中点击item展开一个固定高度的EditText,不能编辑,如果内容过多就需要滚动.但是发现EditText的滚动跟ListView的滚动冲突了



在这里我参考了这个文章: http://blog.csdn.net/goodlixueyong/article/details/41172465  

原理是当点到EditText上的时候,就让EditText获取焦点,屏蔽Listview的滚动,当手指离开EditText的时候,恢复ListView的滚动.但是这会有个问题,影响了用户体验,就是如果内容不多的时候,EditText还是那么高,点在上面的时候,就无法让ListView滚动的.所以这里我就给每个EditText加上一个判断内容高度的处理.如果内容过高,EditText可滚动的时候,就按上去就滚动EditText,如果内容不多或者按在EditText外面的时候,就滚动ListView.

以下是关键代码:


ViewTreeObserver vto = holder.et_comment.getViewTreeObserver();   vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {       @Override        public void onGlobalLayout() {            holder.et_comment.getViewTreeObserver().removeGlobalOnLayoutListener(this);            editText_height=holder.et_comment.getHeight();           if(line_height==0){                Paint textPaint=new Paint(Paint.ANTI_ALIAS_FLAG);                textPaint.setTextSize(holder.et_comment.getTextSize());                LogUtil.v(TAG, "editText_height:"+editText_height+" text size:"+holder.et_comment.getTextSize());                FontMetrics fontMetrics = textPaint.getFontMetrics();                  line_height=(int) Math.abs(fontMetrics.top-fontMetrics.bottom);           }           int contentHeight=holder.et_comment.getLineCount()*line_height;           if(contentHeight>editText_height){                editTextTouchList.put(position, true);                LogUtil.e(TAG, "contentHeight:"+contentHeight+" pos:"+position+" line:"+holder.et_comment.getLineCount()+" 要控 制");           }else{                editTextTouchList.put(position, false);                LogUtil.v(TAG, "editText_height:"+editText_height+" pos:"+position+" line:"+holder.et_comment.getLineCount()+" 不用控制----");           }      }   });


以上是点击item,展开EditText的时候,等EditText绘制好了,获取他的高度.另外还要根据当前字体,来获取每一行的高度,乘以行数,如果内容高于EditText的高度,就用一个列表把是否可以滚动的标识保存起来.P.S:这里没用edittext.getLineHeight这个更简单的方法是因为他获取出来的高度不准,有一点点偏差.有兴趣的朋友们可以自己试试就知道了.


holder.et_comment.setOnTouchListener(new OnTouchListener() {    @Override    public boolean onTouch(View v, MotionEvent event) {        // TODO Auto-generated method stub        switch (v.getId()) {        case R.id.et_comment:             if(editTextTouchList.containsKey(position)){                  if(editTextTouchList.get(position)){                       v.getParent().requestDisallowInterceptTouchEvent(true);                       switch (event.getAction()) {                       case MotionEvent.ACTION_UP:                            v.getParent().requestDisallowInterceptTouchEvent(false);                            break;                       }                  }             }        }        return false;    }});

然后是重写Edittext的onTouch事件,如果这个EditText被记录为需要滚动的,就把他的parent(就是listview)的touch事件给先拦截处理了.如果手指up了,就让他恢复原状.

这样的话就可以让过多内容的EditText滚动,按着内容不多的EditText的时候,就照样可以滚动ListView了.


*****忘了补充说明下,由于重写了onTouch事件,在某些机型上可能会影响长按出那个"复制","黏贴"的选项.这个要留意.由于我的需求是不能编辑,所以没影响,如果你的需要编辑,这个可能要考虑下怎么改******

1 0