我是 Android 的新手,我在使用扩展 BaseAdapter
的自定义类将项目添加到 ListView
时遇到了问题..
所以,我有一个带有菜单的 MainActivity
,允许选择 Add List Item
。它启动名为 InputDataActivity
的新 Activity :
public boolean onOptionsItemSelected(MenuItem item) {
Intent i = new Intent(this,InputDataActivity.class);
startActivityForResult(i,1);
return super.onOptionsItemSelected(item);
}
InputDataActivity
包含两个 EditText's
,允许输入 Name
和 Surname
。还有一个 Button
与方法 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
和 Surname
。我还创建了名为 list_element_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>
好的,我们已经得到了自定义适配器的代码:
public class PersonListAdapter extends BaseAdapter{
private List<Person> personList =new ArrayList<>();
private LayoutInflater layoutInflater; //do tworzenia klasy z XML'a
public PersonListAdapter(LayoutInflater inflater)
{
this.layoutInflater=inflater;
}
public void AddElem(String name, String surname)
{
personList.add(new Person(name, surname));
}
@Override
public int getCount() {
return personList.size();
}
@Override
public Object getItem(int position) {
return personList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null)
{
convertView=layoutInflater.inflate(R.layout.list_element_layout,parent,false); //zapytac o to 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;
}
}
在 MainActivity
的 OnCreate
中,我添加了:
protected void onCreate(Bundle savedInstanceState) {
...
ListView personListView=(ListView)findViewById(R.id.listView);
personListAdapter=new PersonListAdapter(LayoutInflater.from(this));
personListView.setAdapter(personListAdapter);
}
现在,事情是:在我输入一对后:Name
,Surname
在我的第二个 Activity 中,我点击一个按钮发送数据返回到 MainActivity
,然后我使用我的适配器更新我的 ListView
。
我不知道为什么,但它第一次不起作用(我想添加到列表中的第一项),“不起作用”我的意思是,没有错误,但它会返回到 MainActivity,并且不会向 ListView 添加任何内容
但接下来的每一次它都工作正常!
最佳答案
我没看到你调用 notifyDataSetChanged()
的地方。试试这个:
public void AddElem(String name, String surname)
{
personList.add(new Person(name, surname));
notifyDataSetChanged();
}
任何时候修改personList
数组列表,都需要调用notifyDataSetChanged()
关于java - 使用自定义 BaseAdapter 的 ListView - 工作正常但不适用于添加的第一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33417618/