解决RecycleView不按顺序刷新问题

 实现功能:动态添加子条目,每个子条目都是一个对象。

        要求:每个对象可以修改任意值

实现思路: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;
    }
}

解决思路:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值