Java 使用自定义BaseAdapter的ListView-工作正常,但不适用于添加的第一项
我是Android新手,在使用自定义类扩展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
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();
}