向ListView添加项目会导致第一个项目一次又一次出现

时间:2014-03-25 14:19:56

标签: android android-listview android-arrayadapter listadapter dynamically-generated

当应用程序启动时,我从Device的SD卡中加载一些对象并将它们添加到ListView。

Objects = new ArrayList<DataObject>();
Items = new ArrayList<MenuItem>();
Adapter = new MenuItemAdapter(this, Items);

listView.setAdapter(Adapter);

LoadObjects();

当我加载对象时,我反序列化对象,检查它的唯一ID,如果它已经在对象列表中,则不应该添加它。我的方法LoadObjects加载尝试加载具有给定扩展名的目录中的所有文件。然后,如果成功,尝试使用此方法将其加载到Items列表中:

private boolean LoadObject(DataObject obj)
{
     for (DataObject do : Objects)
     {
          if (do.GetID().equals(obj.GetId())
              return false;
     }

     boolean added = Objects.add(do);

     if (added)
     {
          Items.add(new MenuItem(do.GetID(), do.GetName());
          Adapter.notifyDataSetChanged();
     }

     return added;
}

运行此方法&#34; onCreate&#34;它工作正常,它加载所有可以加载的对象并存储在SD卡上。当我尝试在此方法之后添加一个时,第一个项目将出现在列表中,应该添加新项目。我使用Dialog输入一个新名称来创建一个新的DataObject,稍后将调用LoadObject(new DataObject(name));

我试过了:

  1. 重置项目适配器

  2. 添加&#34;添加&#34;自定义适配器上的方法,以便我不是添加到Items,而是通过Adapter.Add(new DataObject(name))通过Adapter添加,它添加到它自己的列表中;我还有一个SetList适配器,用于重新创建列表但没有成功。

  3. 跳过notifyDataSetChanged

  4. 清除对象列表,项目列表,每次创建一个新的适配器 - 重新加载所有对象,所有MenuItem,重新创建适配器并设置新的列表 - 所有这些都具有相同的结果。

  5. 跳过LoadObjects()并让所有新添加的项目出现,第一个是正确的 - 但我后来添加的内容与ListView中的#1相同。

  6. 我必须使用FragmentActivity而不是ListActivity,因为我需要显示一些Dialogs。

    简单地说,我使用ListView来显示SD卡中的特定文件,以便以后能够将它们加载到另一个活动中 - 但是这会阻碍我添加任何新项目而不必重新启动活动只是为了显示新项目,这意味着我需要能够以空列表开始然后

3 个答案:

答案 0 :(得分:0)

<可能是因为您使用具有多个引用的Adapter。尝试重命名并且不要用大写命名变量。(另请参阅导入列表以查看您在那里Adapter有什么内容)

答案 1 :(得分:0)

你的尝试#4必须工作。给下一个loadObject()一个镜头:

private boolean LoadObject(DataObject obj)
{
     for (DataObject do : Objects)
     {
          if (do.GetID().equals(obj.GetID())
              return false;
     }

     Objects.add(obj);
     Items.add(new MenuItem(obj.GetID(), obj.GetName());
     Adapter = new MenuItemAdapter(this, Items);
     listView.setAdapter(Adapter);

     return true;
}

答案 2 :(得分:0)

似乎由于ListView在RelativeLayout中而导致问题发生,尽管我无法弄清楚原因。

这就是我的布局第一次:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <ListView
        android:id="@+id/main_menulist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </ListView>
</RelativeLayout>

当我改为仅使用ListView创建新布局时,问题不再出现:

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_menulist"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ListView>

我只读过你不应该如何将ListView放在ScrollView中,但我之前使用过这种类型的解决方案(可能不是通过动态添加项目),而且它已经有效了。