【问题标题】:Custom adapter size 0 after notifyDataSetChanged()notifyDataSetChanged() 后自定义适配器大小为 0
【发布时间】:2017-02-13 15:34:16
【问题描述】:

我有一个 ListView、一个 ArrayList 和一个扩展 ArrayAdapter 的 MaterielAdapter。我的问题是调用 notifyDataSetChanged() 不会更新我的 ListView...我花了 3 个小时尝试所有类似的问题,但没有一个对我有效。

private ListView lvMateriels;
private ArrayList<Materiel> materiels = new ArrayList<>();
...
lvMateriels = new ListView(this);
lvMateriels.setAdapter(new MaterielAdapter(this, R.layout.object_line,materiels));
...
materiels.add(new Materiel());
((MaterielAdapter)lvMateriels.getAdapter()).notifyDataSetChanged();

我的集合包含所有对象,但列表视图从不刷新,适配器也不刷新...

【问题讨论】:

  • 请发布您的适配器。
  • 您更改的对象在您的适配器类中没有更新,是吗?
  • 你连那个适配器都没用?
  • 我重命名它是为了问这个问题,我把像这样的适配器放在单独的文件中

标签: android listview adapter android-arrayadapter custom-adapter


【解决方案1】:

您可能甚至没有将 ListView 添加到活动视图中。我建议您在布局 xml 中定义一个列表视图,而不是执行新的 Listview(this) 比如:

 <ListView
     android:id="@+id/listview"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>

然后在你的活动中:

lvObjects = (ListView) findViewById(R.id.listview);

【讨论】:

  • 谢谢,但我没那么笨,我确实添加了它。
  • 好吧.....这是我看到的唯一奇怪的东西,但是如果没有其他活动,很难判断发生了什么
  • 虽然我过去也遇到过类似的问题,但有时我已经解决了那些在修改数组和调用 notifyDataSetChanged 之前重新定义数组的问题。虽然这不应该是必需的......
  • 这可能很有用,我明天试试,我的活动有 2k 行长,我没有时间只取有用的部分,谢谢,
【解决方案2】:

找到解决方案

我的问题是我将我的 ArrayList 设置为另一个 ArrayList

materiels = getMateriels() // getMateriels() returns an ArrayList<Materiel>

似乎给列表设置一个新对象是行不通的,我最后做的是以下:

materiels.clear();
materiels.addAll(getMateriels());

顺便说一句,对于那些需要在 ListView 中添加标题的人,您必须这样做:

((YourAdapter)((HeaderViewListAdapter)yourListView.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();

【讨论】:

  • 谢谢!你成功了。我也在做同样的事情。不知道为什么我们不能只做 list = newlist 并调用 NotifyDataSetChanged(),虽然...
【解决方案3】:

储备您的适配器,您的适配器也将成为您的清单。

MaterialAdapter adapter = new MaterialAdapter(this, 
R.layout.object_line);

lvObjects = new ListView(this);
lvObjects.setAdapter(adapter);
...
adapter.add(new Object());
adapter.notifyDataSetChanged();

当前你的适配器,不知道他需要使用你传入参数的列表。但是你扩展了 ArrayAdapter,这意味着你的适配器是一个列表。

【讨论】:

  • Store * ;) et non le problème ne vient pas de là Raphael, en fait si tu veux tout fonctionne très bien sauf cette foutue fonction notifyDataSetChanged... en fait dans la classe où je liste les matériels , j'ai mon ArrayList dont le contenu change à plusieurs endroits et à chaque fois j'appelle notifyDataSetChanged sur mon adapter, qui est censé se mettre à jour par rapport à la liste que je lui ai attribué, mais ça ne veut pas.. alors que quand je reset l'adapter ça fonctionne bien, et la suppression se fait très bien ...
  • D'accord, mais déjà dans ton exemple, 您使用ObjectAdapter 和您的通信适配器MaterielAdapter。 Et c'est un forum uniquement en anglais (je sais que mon anglais est pas wonderful), mais on n'est force de parlé en anglais。
  • J'ai anonymisé pour rendre l'exemple plus simple, en réalité tu l'auras compris object = Materiel
  • Si tu veut resté dans la configuration actuelle, Override getCount() et return materiels.size();
  • J'ai déjà essayé :/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多