使用自定义 BaseAdapter 的 ListView - 工作正常但不适用于添加的第一个项目
ListView using custom BaseAdapter- works fine but not for the first item added
我是 Android 的新手,我在使用扩展 BaseAdapter
..
的自定义 class 添加项目到 ListView
时遇到了问题
所以,我有一个带有菜单的 MainActivity
,允许选择 Add List Item
。它开始新的 activity 命名为 InputDataActivity
:
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
是一个简单的 class,允许保存数据: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
添加任何内容
但接下来每次都正常!
试试这个:
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;
}
我没看到你在哪里打电话notifyDataSetChanged()
。试试这个:
public void AddElem(String name, String surname)
{
personList.add(new Person(name, surname));
notifyDataSetChanged();
}
任何时候修改personList
数组列表,都需要调用notifyDataSetChanged()
它不起作用的原因很简单。这是因为Coordinate Layout
。由于我是 Android
的新手,我不知道在将 ListView
应用于 API 低于 21 的应用程序时会出现一些问题。我设法将其添加到 XML
文件以某种方式为 MainActivity
工作,它对我有用,但如果我想做一些更严肃的事情,我将不得不考虑有关该问题的教程。
我是 Android 的新手,我在使用扩展 BaseAdapter
..
ListView
时遇到了问题
所以,我有一个带有菜单的 MainActivity
,允许选择 Add List Item
。它开始新的 activity 命名为 InputDataActivity
:
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
是一个简单的 class,允许保存数据: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
添加任何内容但接下来每次都正常!
试试这个:
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;
}
我没看到你在哪里打电话notifyDataSetChanged()
。试试这个:
public void AddElem(String name, String surname)
{
personList.add(new Person(name, surname));
notifyDataSetChanged();
}
任何时候修改personList
数组列表,都需要调用notifyDataSetChanged()
它不起作用的原因很简单。这是因为Coordinate Layout
。由于我是 Android
的新手,我不知道在将 ListView
应用于 API 低于 21 的应用程序时会出现一些问题。我设法将其添加到 XML
文件以某种方式为 MainActivity
工作,它对我有用,但如果我想做一些更严肃的事情,我将不得不考虑有关该问题的教程。