使用listView和适配器显示对象

时间:2018-09-17 14:09:17

标签: java android listview android-adapter

我正在编写一个简单的联系人列表应用程序,允许用户输入姓名和姓氏,将这些项目存储在列表中,并将它们显示为editText字段下方的列表。 我创建了一个具有名字和姓氏两个字段的对象,并试图将该对象添加到要显示在按钮下方的列表中。但是,屏幕上没有任何内容。调试消息显示对象已成功创建并添加到列表中,但是我尝试显示对象字段值的方式一定存在问题。如果有人能告诉我我在做什么错,我将非常感激。

这是布局xml代码(ListView部分):

df = pd.DataFrame({'column_1': [1, 1], 
                   'column_2': [['NaN', '18m'], ['lk', 'r']],
                   'column_3': [['kjaf'], ['ddd']]})

print (df)
   column_1    column_2 column_3
0         1  [NaN, 18m]   [kjaf]
1         1     [lk, r]    [ddd]

cols = ['column_2', 'column_3']
df[cols] = df[cols].applymap(lambda x: set([i for i in x if i != 'NaN']))
print (df)

   column_1 column_2 column_3
0         1    {18m}   {kjaf}
1         1  {r, lk}    {ddd}

Java部分:

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

}

和主要功能

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

1 个答案:

答案 0 :(得分:0)

我猜想add()方法应该使用edit texts的名称和姓氏,创建一个新的Person并将其添加到people的列表中。

如果是这种情况,那么您应该将people = Arrays.asList(person);更改为people.add(person);,现在它将始终用一个新的人员列表替换现有列表。

此外,我没有看到add()方法接收到View作为参数的任何原因。除非您打算做其他事情,否则可以将其删除。

最后,在您发布的代码中,add()并没有在任何地方被调用。也许应该在布局上的按钮中的OnClickListener内部调用它。

编辑我

使用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的{​​{1}}。
堆栈跟踪具有所有调用层次,直到抛出异常为止。 您需要将其添加到问题中。