【问题标题】:notifyDataSetChanged() not showing up for custom list adapternotifyDataSetChanged() 未显示自定义列表适配器
【发布时间】:2015-08-28 00:35:40
【问题描述】:


我有一个自定义数组适配器,而不是扩展 ArrayAdapter,但是 notifyDataSetChanged() 方法只是普通的没有显示(如果你尝试它也不起作用)。

class matchAdapter extends ArrayAdapter<Match> {
public matchAdapter(Context context, List<Match> matches) {
    super(context, R.layout.match_layout, matches);
}
@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}

以上来自我的适配器类。 notifyAll() 会做同样的事情吗?

【问题讨论】:

  • 不完全是您的答案,而是一些 cmets:1) 如果您根本不使用该方法,为什么需要覆盖该方法? 2) Java 指南建议您以驼峰式命名您的类,始终以大写字母开头。 3)public 修饰符添加到您的 MatchAdapter 类中。
  • listAdapter 的引用 matchAdapter 或其超类的引用
  • @PauloAvelar 1) 我只是覆盖它只是为了确保方法本身在那里,然后我把它拿出来。 2)我会记住这一点,谢谢! 3) 完成了,但还没有什么新鲜事。
  • @Jerome 是 matchAdapter 类的引用
  • 好的,我不会把它变成一个聊天(违反规则),但这越来越有趣了。如果我有任何想法,我会发布它们作为答案。

标签: android android-arrayadapter


【解决方案1】:

我会写一个例子,它不是真正的代码,但它是你必须这样做的方式。

  1. 创建您的List

    ArrayList&lt;matchList&gt; matchList = new ArrayList&lt;matchList&gt;();

  2. 创建一个Adapter

    adapter = new matchAdapter(this, matchList);

  3. 设置Adapter

    YourListView.setAdapter(adapter);

  4. 你更改了 List 上的内容

    matchList.add(Stuff for your list);

  5. 现在通知List 已更改操作:

    adapter.notifyDataSetChanged();

希望对您有所帮助,如果没有,请输入评论,我会尝试更新我的答案。

编辑

我会给你一些例子......

当您想致电notifyDataSetChanged() 时,只需这样做:

List.clear();
List.addAll(YourStuff);
adapter.notifyDataSetChanged();

其他方法可能是,您正在使用AsyncTask,因此您的onBackGround() 可以使其返回列表中的项目,然后在您的onPostExecute 上更新适配器。

例子:

 @Override
  protected List<matchList> doInBackground(String... params) {
       List<matchList> items = loadUpdatedDataset(params);
       return items;
  }      

  @Override
  protected void onPostExecute(List<matchList> itemschangeds) {
    updateAdapterDataset(itemschangeds);
    adapter.notifyDataSetChanged();
  }

【讨论】:

  • 我很确定我做到了所有这些。 matchList 在第一次调用适配器之前填充,所以我拥有的是。 listAdapter = new matchAdapter(MainActivity.this, matchList); matchHistory.setAdapter(listAdapter);但我仍然无法让我的适配器显示 notifyDataSetChanged 方法。
  • 你有所有作为全局变量吗?
  • 是的,但是你打电话给clear()add()insert()remove() 在尝试拨打notifydatasetchanged() 之后?
  • 我不确定你所说的全局是什么意思,但是 matchList 和适配器是在类中声明的,而不是在方法中。所有这些都发生在同一个班级中
  • protected void onPostExecute(Void aVoid) { //intents to activity showing the user's match history listAdapter = new matchAdapter(MainActivity.this, matchList); matchHistory = (ListView) findViewById(R.id.matchHistoryList); matchHistory.setAdapter(listAdapter); //sets the array adapter to the match history list view matchHistory.setOnItemClickListener(new AdapterView.OnItemClickListener() { //detects on click on a specific item } 这是在 asynctask 类中。天哪,我该如何格式化
【解决方案2】:

您是否尝试过编译和运行应用程序?如果您的 matchAdapter 上方有任何语法错误(例如缺少 ; 或 "),它会破坏自动完成功能。

【讨论】:

  • 只是加上我的 2 美分.. 他试过手动输入notifyDataSetChanged() 吗?如果这不起作用,则可能是损坏的 sdk 文件
  • 尝试用ArrayAdapter&lt;Match&gt;()替换matchAdapter(),然后看看notifyDataSetChanged是否出现
  • 很奇怪。你能把你的项目上传到github吗?我会在我的环境中尝试一下,看看会发生什么
【解决方案3】:

您的listAdapter 被声明为具有ListAdapter 类型,它没有您期望的方法(notifyDataSetChanged)。您需要至少将其设为BaseAdapter 或将其转换为BaseAdapter(我假设您的MatchAdapter 至少是BaseAdapter - 如果不是,那么调用这样的方法将毫无意义:-) )

((BaseAdapter)listAdapter).notifyDataSetChanged();

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多