实现功能:动态添加子条目,每个子条目都是一个对象。
要求:每个对象可以修改任意值
实现思路:RecycleViewAdapter 子条目包含输入框,动态改变输入框的值
遇到问题:在动态增加子条目时 需要给每个子条目中的EditText 赋值 存入对象
刷新数据源的时候,原本赋过的值,再次刷新,发现数据会乱
造成原因:发现问题所在,recycleViewAdapter开始刷新是按顺序的,但进行多次刷新,发现集合数据没有按顺序刷新,
下标不固定,所以造成,赋值赋错对象的情况,造成数据源改变的情况。
解决思路:在一进来开始给EditText赋值时,传一个标志位
holder.etMeasureItemValue.setPaintFlags(position);
在EditText动态改变赋值的时候,判断下标,根据对象下标赋值对象的对象
//输入框改变赋值
holder.etMeasureItemValue.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
//存入对象
cbMeasureItemList.get(holder.etMeasureItemValue.getPaintFlags()).setCbMeasureItemValue(s.toString());
}
});
EditTextChanged动态改变赋值是按正常顺序刷新,但上面的初次进来赋值,有时候没有按原来顺序刷新。
package com.android.sdlc.checkterminal.ui.cloudRecord.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.sdlc.checkterminal.R;
import com.android.sdlc.checkterminal.ui.cloudRecord.activity.CoudRecordsActivity;
import com.android.sdlc.checkterminal.ui.cloudRecord.bean.UploadDataBean;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MeasureItemAdapter extends RecyclerView.Adapter<MeasureItemAdapter.TextHolder> {
private Context context;
private List<UploadDataBean.CbMeasureItem> cbMeasureItemList;
public MeasureItemAdapter(CoudRecordsActivity coudRecordsActivity, List<UploadDataBean.CbMeasureItem> cbMeasureItemList) {
this.context = coudRecordsActivity;
this.cbMeasureItemList = cbMeasureItemList;
}
@Override
public TextHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate(context, R.layout.measure_item_layout, null);
return new TextHolder(view);
}
@Override
public void onBindViewHolder(final TextHolder holder, final int position) {
// final UploadDataBean.CbMeasureItem cbMeasureItem = cbMeasureItemList.get(position);
//初赋值
holder.tvMeasureItemName.setText(cbMeasureItemList.get(position).getCbMeasureItemName()+"("+cbMeasureItemList.get(position).getCbMeasureItemUnit()+")");
holder.etMeasureItemValue.setPaintFlags(position);
if (TextUtils.isEmpty(cbMeasureItemList.get(position).getCbMeasureItemValue())){
holder.etMeasureItemValue.setText("");
}else{
holder.etMeasureItemValue.setText(cbMeasureItemList.get(position).getCbMeasureItemValue());
}
//点击事件
holder.ivIconScanf.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getTypeAndPostion.callBackTypeAndPostion(cbMeasureItemList.get(position).getCbMeasureItemUnit()+"",position);
}
});
holder.ll.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
getPostion.callBackPostion(position);
return false;
}
});
//输入框改变赋值
holder.etMeasureItemValue.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
//存入对象
cbMeasureItemList.get(holder.etMeasureItemValue.getPaintFlags()).setCbMeasureItemValue(s.toString());
}
});
}
@Override
public int getItemCount() {
return cbMeasureItemList.size();
}
public class TextHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tv_measure_item_name)
TextView tvMeasureItemName;
@BindView(R.id.et_measure_item_value)
EditText etMeasureItemValue;
@BindView(R.id.iv_icon_scanf)
ImageView ivIconScanf;
@BindView(R.id.ll)
LinearLayout ll;
public TextHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
}
}
public GetTypeAndPostion getTypeAndPostion;
public GetPostion getPostion;
//创建接口
public interface GetTypeAndPostion{
void callBackTypeAndPostion(String type,int postion);
};
public interface GetPostion{
void callBackPostion(int postion);
}
public void setGetPostion(GetPostion getPostion) {
this.getPostion = getPostion;
}
public void setGetTypeAndPostion(GetTypeAndPostion getTypeAndPostion) {
this.getTypeAndPostion = getTypeAndPostion;
}
}
解决思路: