您的位置:首页 > 移动开发 > Android开发

listview+edittext完美解决方案

2015-12-21 16:19 816 查看
       通常如果listview中的item内容有edittext的时候,会出现很多问题。

主要有1.点击弹出编辑框,edittext会失去焦点。

           2.输入内容后,向下滑动因为listview的item重用机制,你在上面输入的内容下面的item也会显示。

           3.输入内容后,向下滑动再拉回来原来的数据消失。

           4.在需要为edittext设置监听时会出现卡的现象

      下面我们直接代码来说:

viewHolder.editText.setOnTouchListener(new OnTouchListener() {

            

            @SuppressLint("ClickableViewAccessibility")

            @Override

            public boolean onTouch(View v, MotionEvent event) {

                // TODO Auto-generated method stub

                if(event.getAction()==MotionEvent.ACTION_UP){

                    index=position;

                }

                return false;

            }

        });

        

        viewHolder.editText.setOnFocusChangeListener(new OnFocusChangeListener() {

            //设置焦点监听,当获取到焦点的时候才给它设置内容变化监听解决卡的问题

            

            @Override

            public void onFocusChange(View v, boolean hasFocus) {

                EditText et=(EditText) v;

                if(mWatcher==null){

                    mWatcher=new myWatcher();

                }

                if(hasFocus){

                    et.addTextChangedListener(mWatcher);//设置edittext内容监听

                }else {

                    et.removeTextChangedListener(mWatcher);

                }

                

            }

        });

        

        viewHolder.editText.clearFocus();//防止点击以后弹出键盘,重新getview导致的焦点丢失

        if (index != -1 && index == position) {

            // 如果当前的行下标和点击事件中保存的index一致,手动为EditText设置焦点。

            viewHolder.editText.requestFocus();

        }

        viewHolder.editText.setText(text[position]);//这一定要放在clearFocus()之后,否则最后输入的内容在拉回来时会消失

        viewHolder.editText.setSelection(viewHolder.editText.getText().length());

//        viewHolder.editText.addTextChangedListener(new myWatcher());//放弃直接的为每一个edittext设置监听内容变化

class myWatcher implements TextWatcher{

        @Override

        public void beforeTextChanged(CharSequence s, int start, int count,

                int after) {

            // TODO Auto-generated method stub

            

        }

        @Override

        public void onTextChanged(CharSequence s, int start, int before,

                int count) {

            // TODO Auto-generated method stub

            

            

        }

        @Override

        public void afterTextChanged(Editable s) {

            text[index]=s.toString();//为输入的位置内容设置数组管理器,防止item重用机制导致的上下内容一样的问题

        }

        

    }

    源码地址:http://download.csdn.net/detail/u013377714/9370685
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview edittext