【问题标题】:Losing EditText Value After Calling notifyDataSetChanged();调用 notifyDataSetChanged() 后丢失 EditText 值;
【发布时间】:2018-11-26 09:46:57
【问题描述】:

我有一个 ListView,它可以通过调用 notifyDataSetChanged(); 并将行数增加 1 将新行附加到底部。ListView 包含 EditTexts.

调用notifyDataSetChanged(); 后,我想保留用户之前输入的值。只要我在调用notifyDataSetChanged(); 后不返回并更新我已经输入的值之一,它似乎就可以工作。代码如下:

public class AddPeopleNewProcedureActivity extends AppCompatActivity {

    private ListView addPeopleListView;
    private CustomAdapterClass customAdapter;
    private FloatingActionButton fab;
    private int lineCount;
    private EditText personsNameET;
    private EditText personsPhoneET;
    private List<String> personsName;
    private List<String> personsPhone;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addpeoplenew_activity);

        setupActivityReferences();
        inflateListView();
        setupClickListeners();

    }

    private void setupClickListeners() {
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                lineCount = lineCount +1;
                customAdapter.notifyDataSetChanged();

            }
        });
    }

    private void inflateListView() {
        customAdapter = new CustomAdapterClass();
        addPeopleListView.setAdapter(customAdapter);
    }

    private void setupActivityReferences() {
        addPeopleListView = (ListView) findViewById(R.id.listViewAddPeople);
        fab = findViewById(R.id.fabAddPerson);
        lineCount = 1;
        personsName = new ArrayList<String>();
        personsPhone = new ArrayList<String>();
    }

    public class CustomAdapterClass extends BaseAdapter {

        @Override
        public int getCount() {
            return lineCount;
        }

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

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            if (view == null){
                view = getLayoutInflater().inflate(R.layout.row_addpersonnew,null);
            }

            personsNameET = (EditText) view.findViewById(R.id.personNameEditText);
            personsPhoneET = (EditText) view.findViewById(R.id.personPhoneNoEditText);

            final int rowClicked = i;

            if (personsName != null && !personsName.isEmpty() && !(rowClicked >= personsName.size())){
                personsNameET.setText(personsName.get(rowClicked));
            }

            if (personsPhone != null && !personsPhone.isEmpty() && !(rowClicked >= personsPhone.size())){
                personsPhoneET.setText(personsPhone.get(rowClicked));
            }

            personsNameET.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) {
                    if(!personsName.isEmpty()){
                        if (!(rowClicked >= personsName.size())){
                            personsName.set(rowClicked,personsNameET.getText().toString());
                            System.out.println("Set "+rowClicked + "Value is: " + personsName.get(rowClicked));
                        }else{
                            personsName.add(rowClicked,personsNameET.getText().toString());
                            System.out.println("Added" +rowClicked + "Value is: " + personsName.get(rowClicked));
                        }
                    } else{
                        personsName.add(rowClicked,personsNameET.getText().toString());
                        System.out.println("Added" +rowClicked + "Value is: " + personsName.get(rowClicked));
                    }

                }
            });

            personsPhoneET.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) {

                }
            });

            return view;
        }
    }

}

【问题讨论】:

    标签: java android listview android-edittext notifydatasetchanged


    【解决方案1】:

    您在代码中使用了两次此代码 sn-p。请删除空白:

    personsPhoneET.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) {
    
                }
            });
    

    这样做:

    public class AddPeopleNewProcedureActivity extends AppCompatActivity {
    
    private ListView addPeopleListView;
    private CustomAdapterClass customAdapter;
    private FloatingActionButton fab;
    private int lineCount;
    private EditText personsNameET;
    private EditText personsPhoneET;
    private List<String> personsName;
    private List<String> personsPhone;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addpeoplenew_activity);
    
        setupActivityReferences();
        inflateListView();
        setupClickListeners();
    
    }
    
    private void setupClickListeners() {
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                lineCount = lineCount +1;
                customAdapter.notifyDataSetChanged();
    
            }
        });
    }
    
    private void inflateListView() {
        customAdapter = new CustomAdapterClass();
        addPeopleListView.setAdapter(customAdapter);
    }
    
    private void setupActivityReferences() {
        addPeopleListView = (ListView) findViewById(R.id.listViewAddPeople);
        fab = findViewById(R.id.fabAddPerson);
        lineCount = 1;
        personsName = new ArrayList<String>();
        personsPhone = new ArrayList<String>();
    }
    
    public class CustomAdapterClass extends BaseAdapter {
    
        @Override
        public int getCount() {
            return lineCount;
        }
    
        @Override
        public Object getItem(int i) {
            return null;
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
    
            if (view == null){
                view = getLayoutInflater().inflate(R.layout.row_addpersonnew,null);
            }
    
            personsNameET = (EditText) view.findViewById(R.id.personNameEditText);
            personsPhoneET = (EditText) view.findViewById(R.id.personPhoneNoEditText);
    
            final int rowClicked = i;
    
            if (personsName != null && !personsName.isEmpty() && !(rowClicked >= personsName.size())){
                personsNameET.setText(personsName.get(rowClicked));
            }
    
            if (personsPhone != null && !personsPhone.isEmpty() && !(rowClicked >= personsPhone.size())){
                personsPhoneET.setText(personsPhone.get(rowClicked));
            }
    
            personsNameET.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) {
                    if(!personsName.isEmpty()){
                        if (!(rowClicked >= personsName.size())){
                            personsName.set(rowClicked,personsNameET.getText().toString());
                            System.out.println("Set "+rowClicked + "Value is: " + personsName.get(rowClicked));
                        }else{
                            personsName.add(rowClicked,personsNameET.getText().toString());
                            System.out.println("Added" +rowClicked + "Value is: " + personsName.get(rowClicked));
                        }
                    } else{
                        personsName.add(rowClicked,personsNameET.getText().toString());
                        System.out.println("Added" +rowClicked + "Value is: " + personsName.get(rowClicked));
                    }
    
                }
            });
    }
    

    【讨论】:

    • 请仔细检查,personPhoneET和personsNameET是不同的
    • 我知道两者是不同的我上面没有提到两者都是相同的@YashwantSingh
    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多