Android 解决在RecyclerView/ListView 复用中Edittext数据显示混乱

开发中,经常会遇到需要在适配器中设置Edittext进行文字的输入,就会出现滑动时文字错乱等问题,今天做个记录

一:ViewHolder里的设置

在适配器中, 实现TextWatcher,通过MyTextWatcher(DataViewHolder holder) 构造函数,将ViewHolder对象传入,在afterTextChanged方法中,通过ViewHolder,获取对应控件设置的tag,tag为当前的位置,即数据的position, getData()为我们设置的获取适配器的数据list,通过修改对应的位置内容来存储修改的数据(数据的改变也可以通过设置接口,传到activity中进行设置)

    class DataViewHolder extends RecyclerView.ViewHolder {


        /**
         * EditText  输入
         */
        @BindView(R.id.phone_tv)
        EditText phoneTv;

        private DataViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

 //在ViewHolder类中 实现TextWatcher类
    class MyTextWatcher implements TextWatcher {
       
        private DataViewHolder holder;
        //传入对应的ViewHolder
        public MyTextWatcher(DataViewHolder holder) {
            this.holder = holder;
        }

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

        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {
          //通过ViewHolder,获取对应控件设置的tag,tag为当前的位置,即数据的position, getData()为我设置的获取适配器的数据list,通过以下代码改变当前的内容

            getData().set((Integer) holder.phoneTv.getTag(), s.toString());
        }
    }

二:对Edittext的设置

       //将当前的position设置到tag中,供步骤一提到的获取position,防治数据错乱
        holder.phoneTv.setTag(position);
        // 让Edittext持有一个TextWathcer,传入ViewHolder对象
        holder.phoneTv.addTextChangedListener(new MyTextWatcher(holder));
       // 设置text时记得有数据或没数据都要进行对应的设置,否则也会出现显示混乱
        holder.phoneTv.setText(TextUtils.isEmpty(bean) ? "" : bean);

基本经过以上2步的设置,就能解决Edittext在适配器中复用混乱的问题。

 

三:NestedScrollView套RecyclerView出现滑动冲突的问题

只需设置以下的配置,就能解决问题,改设置会实现RecyclerView无法单独滑动,会显示出所有的item,将滑动交给了NestedScrollView

  mRecyclerView.setNestedScrollingEnabled(false);

四:NestedScrollView套ListView 出现显示不全的问题

网上一抓一大把,本文采用其中之一方案,复写listView

public class NoScrollListView extends ListView {
    public NoScrollListView(Context context) {
        super(context);
    }

    public NoScrollListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  //测量的大小由一个32位的数字表示,前两位表示测量模式,后30位表示大小,这里需要右移两位才能拿到测量的大小
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值