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

标签 java android listview android-listview

我是 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,允许输入 NameSurname。还有一个 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 是一个简单的类,允许保存数据:NameSurname。我还创建了名为 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;
    }
}

MainActivityOnCreate 中,我添加了:

protected void onCreate(Bundle savedInstanceState) {
        ...

        ListView personListView=(ListView)findViewById(R.id.listView);
        personListAdapter=new PersonListAdapter(LayoutInflater.from(this));
        personListView.setAdapter(personListAdapter);
    }

现在,事情是:在我输入一对后:NameSurname 在我的第二个 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/

相关文章:

java - "Exception in thread "主要 "org.hibernate.HibernateException: Could not parse configuration: hibernate.cfg.xml"

java - ListView 项目删除更改项目高度

java - ListView onItemSelected 监听器不工作

java - 如何使用 CDATA 创建 SOAP 请求

java - 在 JBoss 5(或 Tomcat 5.5)中禁用 'localhost' 主机

android - 在 Android 中释放资源

java - RecyclerView 滚动时滞后

c# - 如何获取 ListView 数据模板项目双击WPF MVVM

php - 为什么我的 mysql 表的后续结果没有在 ListView 中创建新对象?

java - 可点击的textView不起作用