listview+edittext完美解决方案

       通常如果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重用机制导致的上下内容一样的问题
        }
        
    }

下面补充RecycleView处理edittext列表问题,与上面方法类似。稍微做了些改进,比如将onFocusChange监听方法放入onCreateViewHolder中,通过tag传递位置。可以通过复用不用重复设置监听事件。

@Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.futures_over_price_item, parent, false);
        ItemViewHolder itemViewHolder = new ItemViewHolder(view);
        itemViewHolder.editOverPricePos.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                EditText et=(EditText) v;
                int position = (int)v.getTag();
                if(watcher == null){
                    watcher = new MTextWatcher();
                }
                if(hasFocus){
                    et.addTextChangedListener(watcher);
                    index = position;
                }else{
                    et.removeTextChangedListener(watcher);
                }
            }
        });
        return itemViewHolder;
    }


    @Override
    public void onBindViewHolder(ItemViewHolder holder, int position) {
        holder.tvName.setText( mList.get(position).getName());
        holder.tvChangeValue.setText(mList.get(position).getChangeValue());

        holder.editOverPricePos.setTag(position);//记录位置,防止复用引发的错乱问题
        holder.editOverPricePos.clearFocus();//防止点击以后弹出键盘,重新getview导致的焦点丢失
        if (index != -1 && index == position) {
            // 如果当前的行下标和点击事件中保存的index一致,手动为EditText设置焦点。
            holder.editOverPricePos.requestFocus();
        }
        holder.editOverPricePos.setText(mList.get(position).getOverPricePosition());
        if (index != -1 && index == position) {
            // 设置光标位置
            holder.editOverPricePos.setSelection(holder.editOverPricePos.getText().toString().length());
        }
    }
    class MTextWatcher implements TextWatcher {

        @Override
        public void afterTextChanged(Editable s) {
            if(index != -1) {
                mList.get(index).setOverPricePosition(s.toString());
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                                  int count) {
        }

    }


 

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水的川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值