Java 使用自定义BaseAdapter的ListView-工作正常,但不适用于添加的第一项

Java 使用自定义BaseAdapter的ListView-工作正常,但不适用于添加的第一项,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我是Android新手,在使用自定义类扩展BaseAdapter向ListView添加项目时遇到了麻烦 因此,我有一个带有菜单的main活动,可以选择添加列表项。它启动名为InputDataActivity的新活动: public boolean onOptionsItemSelected(MenuItem item) { Intent i = new Intent(this,InputDataActivity.class); startActivityForRe

我是Android新手,在使用自定义类扩展
BaseAdapter
ListView
添加项目时遇到了麻烦

因此,我有一个带有菜单的
main活动
,可以选择
添加列表项
。它启动名为
InputDataActivity
的新活动:

public boolean onOptionsItemSelected(MenuItem item) {
        Intent i = new Intent(this,InputDataActivity.class);
        startActivityForResult(i,1);

        return super.onOptionsItemSelected(item);
    }
InputDataActivity
包含两个
EditText
,允许输入
姓名和
姓氏。还有一个
按钮
与方法
AddPerson
关联:

public void AddPerson(View view)
{
    Intent data = new Intent();
    data.putExtra("name",editText1.getText().toString());
    data.putExtra("surname",editText2.getText().toString());
    setResult(RESULT_OK,data);
    finish();
}
然后,在
MainActivity
中还有:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        personListAdapter.AddElem(data.getStringExtra("name"), data.getStringExtra("surname"));
    }
PersonListAdapter
是我的适配器从
BaseAdapter
扩展而来。在我展示代码之前,有几点很重要
Person
是一个简单的类,允许保存数据:
Name
Lastname
。我还创建了名为
list\u element\u layout
的自定义布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/nameAndSurname"
        android:drawableLeft="@android:drawable/btn_star_big_on"
        android:drawableStart="@android:drawable/btn_star_big_on"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40sp"/>

</LinearLayout>
现在,问题是:在我的第二个活动中输入一对:
名称
姓氏
后,我单击一个按钮将数据发送回
主活动
,然后我使用适配器更新我的
列表视图

我不知道为什么,但它第一次不起作用(我想添加到列表中的第一项),我说的“不起作用”是指没有错误,但它返回到MainActivity,并且没有任何内容添加到ListView

但每连续一次,它都可以正常工作

试试这个:

public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView==null)
    {
        convertView=layoutInflater.inflate(R.layout.list_element_layout,parent,false);
    }
    Person person = personList.get(position);
    TextView nameAndSurname = (TextView)convertView.findViewById(R.id.nameAndSurname);
    String textToWrite=person.getName()+" "+person.getSurname();
            nameAndSurname.setText(textToWrite);
    return convertView;
}
public void AddElem(String name, String surname)
{
    personList.add(new Person(name, surname));
    notifyDataSetChanged();
}

我看不到您在哪里调用
notifyDataSetChanged()
。试试这个:

public void AddElem(String name, String surname)
{
    personList.add(new Person(name, surname));
    notifyDataSetChanged();
}

无论何时修改
personList
数组列表,都需要调用
notifyDataSetChanged()

它不起作用的原因很简单。这是因为
坐标布局
。由于我是新加入的
Android
,我不知道在将
ListView
应用于API低于21的应用程序时,它会出现一些问题。我设法将它添加到<代码> XML<代码>文件中,它对于我来说是有效的,但是如果我想使事情变得更严重,我将不得不考虑关于这个问题的教程。结果还是一样,事实并非如此。尽管它工作得很好,我在回答中已经解释过了。我很高兴您解决了问题,但请注意,无论何时更改自定义
BaseAdapter中使用的列表,您都必须调用
notifyDataSetChanged()
。您的代码可能是由于某种奇怪的时间巧合而工作的。或者您恰好在
BaseAdapter
外部调用它。不管怎样,它仍然需要这样做。您可能看不到问题,但它潜伏在那里,并可能会导致以后的问题,具体取决于您如何使用适配器。感谢您对本文的贡献,我对此表示感谢:)我理解您的建议,我必须承认这是有道理的。首先,我认为通过使用
personListAdapter.AddElem(…)
,这会导致自定义适配器类中定义的
List
发生更改,它会自动发生。我的意思是,我更改了一个列表的内容,该列表用于设置重写方法中的所有ID等,它调用适配器的
getView()
方法。但显然这不对吗?:)对。适配器连接到的
列表视图
不知道数据已更改。调用notifyDataSetChanged()
可以让它知道数据已更改,必须开始UI更新。
public void AddElem(String name, String surname)
{
    personList.add(new Person(name, surname));
    notifyDataSetChanged();
}