开发中,经常会遇到需要在适配器中设置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);
}
}