Отобразить объект с помощью listView и адаптера - PullRequest
0 голосов
/ 17 сентября 2018

Я пишу простое приложение со списком контактов, которое позволяет пользователю вводить имя и фамилию, сохраняет эти элементы в списке и отображает их в виде списка под полями 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"

1 Ответ

0 голосов
/ 17 сентября 2018

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

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

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

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

РЕДАКТИРОВАТЬ 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 у основания слева:

enter image description here

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

...