java - 调用 notifyDataSetChanged() 后丢失 EditText 值;

标签 java android listview android-edittext notifydatasetchanged

我有一个 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;
        }
    }

}

最佳答案

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

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));
                }

            }
        });
}

关于java - 调用 notifyDataSetChanged() 后丢失 EditText 值;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53478399/

相关文章:

java - Hadoop 进程的 jps 命令

java - Java 中的 HMAC-SHA256/从 C# 翻译

android - 双击时防止 Bottom Sheet 对话框 fragment 显示两次

android - Row 内的 SingleChildScrollView

java - 光标窗口 : Window is full

Android 如何将与 ListView 项目相关的数据从 sqlite 数据库传递到下一个 Activity

java - 当软键盘出现时,使用 Recycler View 调整布局大小

java - 如何对并发映射的值进行原子操作?

java -/google-play-services_lib/AndroidManifest.xml : Premature end of file 的解析器异常

Android ListView 文本颜色 白色