Отображение объекта с помощью listView и адаптера

Я пишу простое приложение со списком контактов, которое позволяет пользователю вводить имя и фамилию, сохраняет эти элементы в списке и отображает их в виде списка под полями editText. Я создал объект с двумя полями: имя и фамилию, и попытался добавить объект в список, который будет отображаться под кнопками. Однако на экране ничего не появляется. Сообщение отладки показывает, что объект успешно создан и добавлен в список, но должно быть что-то не так с тем, как я пытаюсь отобразить значения полей объекта. Буду крайне признателен, если кто-нибудь подскажет, что я здесь делаю не так.

Вот XML-код макета (часть ListView):

  <ListView
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:id = "@+id/listView1"
        android:layout_marginTop = "20dp"/>

часть Java:

public class Person {
private static String firstname;
private static String lastname;

public Person(String firstname, String lastname) {
    this.firstname = firstname;
    this.lastname = lastname;
}

public static String getFirstname() {
    return firstname;
}

public static String getLastname() {
    return lastname;
}

public String toString(){
    return  getFirstname()+ " " + getLastname();
}

}

и основная функция

public class MainActivity extends AppCompatActivity {


private EditText ent_name;
private EditText ent_surname;
private ListView listView;
private Person person;
private String first_name;
private String last_name;
private ArrayAdapter<Person> adapter;
private List<Person> people = new ArrayList<>();


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

    ent_name = findViewById(R.id.txt_firstName);
    ent_surname = findViewById(R.id.txt_lastName);
    listView = findViewById(R.id.listView1);

    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, people);
    listView.setAdapter(adapter);


}

public void clear(View view) {
    ent_name.setText("");
    ent_surname.setText("");

}

public void add(View view) {
    first_name = ent_name.getText().toString();
    last_name = ent_surname.getText().toString();

    Person person = new Person(first_name, last_name);
    people = Arrays.asList(person);
    adapter.notifyDataSetChanged();
}

}

Журнал отладки

people.get(0) = {Person@11058} "Harry Potter"
this = {MainActivity@11055} 
view = {AppCompatButton@11057} "android.support.v7.widget.AppCompatButton{1bc3388 VFED..C.. ...P.... 720,0-1028,168 #7f070019 app:id/add}"
person = {Person@11058} "Harry Potter"
 firstname = "Harry"
 lastname = "Potter"
 shadow$_klass_ = {Class@10711} "class com.example.lavague.list.Person"
 shadow$_monitor_ = 0
adapter = {ArrayAdapter@11059} 
people = {ArrayList@11056}  size = 1
 0 = {Person@11058} "Harry Potter"

Где вызывается add ()?

Juan 17.09.2018 16:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
663
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что метод add() должен взять имя и фамилию из edit texts, создать новый Person и добавить его в список people.

Если это так, то вам следует заменить people = Arrays.asList(person); на people.add(person);. Теперь он всегда будет заменять существующий список новым списком из одного человека.

Кроме того, я не вижу причин для метода add() получать View в качестве параметра. Если вы не планируете делать что-то еще, вы можете удалить это.

Наконец, в опубликованном вами коде add() нигде не вызывается. Возможно, его следует вызывать внутри OnClickListener кнопкой на макете.

ИЗМЕНИТЬ I

Как вы используете класс Person, у него не должно быть статических членов. Статические члены являются общими для всех экземпляров. Таким образом, изменение имени, если оно статическое, изменит имя для всех экземпляров Person.

public class Person {
    private String firstname;
    private String lastname;

    public Person(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }

    public static String getFirstname() {
        return firstname;
    }

    public static String getLastname() {
        return lastname;
    }

    public String toString(){
        return  getFirstname()+ " " + getLastname();
    }
}

Чтобы узнать о сбое, проверьте Logcat в нижней части слева:

И ищите Exception с stack trace.
Трассировка стека содержит всю иерархию вызовов до момента, когда возникает исключение. Вам нужно будет добавить это к вопросу.

Это правильно, идея состоит в том, чтобы создать нового человека и добавить в список людей. Извините, я забыл включить код для метода добавления - это функция, привязанная к кнопке, которая добавляет введенные значения при нажатии. Я изменил asList на add (), и приложение упало.

Rita V. 17.09.2018 16:33

Также, как вы используете Person, атрибуты и методы не должны быть статичными.

Juan 17.09.2018 17:03

Надеюсь, я правильно понял: people = {ArrayList @ 11052} size = 1 this = {MainActivity @ 11051} view = {AppCompatButton @ 11053} "android.support.v7.widget.AppCompatButton {1bc3388 VFED..C .. ... P .... 720,0-1028,168 # 7f070019 app: id / add} "person = {Person @ 11054}" ​​Harry Potter "adapter = {ArrayAdapter @ 11055} people = {ArrayList @ 11052} size = 1

Rita V. 17.09.2018 17:54

Пожалуйста, отредактируйте вопрос и добавьте его туда. Я не могу прочитать это в комментариях.

Juan 17.09.2018 17:57

Мне плохо, извини. Я новичок как в Java, так и в Android-студии. Я отредактировал исходный вопрос, но не уверен, что правильно понял.

Rita V. 17.09.2018 21:08

Смотрите мой Edit I в ответе.

Juan 17.09.2018 21:35

Спасибо, Хуан. Я просмотрел свой код еще раз, отредактировал класс Person, и он сработал. Спасибо еще раз!

Rita V. 18.09.2018 20:08

Другие вопросы по теме