在列表视图中调用“ notifydatasetchanged”时,前几行被新行替换

时间:2018-07-23 09:15:26

标签: android listview

我想通过custom listviewclickingbutton添加一些新行。我的每一行都包含一个EditText。我需要每次在clicking上的Button上创建新行。我成功完成了任务,但是这里面临的问题是,clickingButton的时候,会创建一个新行,但它刷新了整个自定义listview并替换了我所有的内容用空的EditText写的(它正在创建一些新的EditText)。我不需要这种情况。即使创建了新行,我也需要保留在EditText中写的全部数据。

  

这是我的代码,名为adapter

final RequestAttributeAdapter adapter = new RequestAttributeAdapter(context,listItems);
    lv_Attribute.setAdapter(adapter);
    tvAddAttribute.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            listItems.add("1");
            adapter.notifyDataSetChanged();
        }
    });
  

这是我的adapter class

private ArrayList<String> attributes;
private LayoutInflater inflater;

public RequestAttributeAdapter(Context context, ArrayList<String> attributes) {
    this.attributes = attributes;
    inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
    return attributes.size();
}


@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}

@SuppressLint({"InflateParams", "ViewHolder"})
@Override
public View getView(final int position, View view, ViewGroup viewGroup) {
    view = inflater.inflate(R.layout.item_attribute_list,null);
    FloatingEditText ftName = (FloatingEditText) view.findViewById(R.id.etAttrName);
    TextView attributeNumber = (TextView) view.findViewById(R.id.attributeNumber);
    attributeNumber.setText("Attribute : "+(position+1));
    //CheckBox cbRequired = (CheckBox) view.findViewById(R.id.cbRequired);

    //cbRequired.setChecked(attributes.get(position).isRequired());
    //ftName.setText(attributes.get(position).getAttribute_name());
    if (position>0)
        ftName.requestFocus();

    ftName.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
            //attributes.get(position).setAttribute_name(editable.toString());
        }
    });
    return view;
}

2 个答案:

答案 0 :(得分:0)

我认为使用notifyDataSetChanged()函数是不可能的,但是您可以尝试使用此https://android.jlelse.eu/smart-way-to-update-recyclerview-using-diffutil-345941a160e0

答案 1 :(得分:0)

您可以通过将EditText的数据根据​​其位置保存到ArrayList并在getView()中将数据从ArrayListsetText()到{{ 1}}

希望这会有所帮助