【问题标题】:How to call notifyDataSetChanged() from a generic Adapter如何从通用适配器调用 notifyDataSetChanged()
【发布时间】:2010-05-19 16:27:38
【问题描述】:

ListViewOnItemClickListener 具有以下方法:

@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id)

我想让ListView 刷新后面的适配器,我相信这是通过使用:

BaseAdapter.notifyDataSetChanged()

如何使用onItemClick 方法中的parent 参数来做到这一点?到目前为止,我已经尝试过:

parent.getAdapter().notifyDataSetChanged();

这会引发错误,因为返回的对象属于 HeaderViewListAdapter 类,由于未知原因,它不是 BaseAdapter 的子类。

【问题讨论】:

    标签: android listview adapter listadapter


    【解决方案1】:

    您还可以通过自定义适配器访问 BaseAdapter,如以下代码片段所示:

    public class HeaderViewListAdapter extends BaseAdapter {
    
    ...
    
      @Override
      public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
      }
    
    ...
    }
    

    【讨论】:

      【解决方案2】:

      这会引发错误,因为返回的对象属于类 HeaderViewListAdapter,由于未知原因,它不是 基础适配器。

      ((BaseAdapter) ((HeaderViewListAdapter)listView.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
      

      【讨论】:

        【解决方案3】:

        AFAIK,HeaderListView 中没有用于数据刷新/重新加载的任何方法。我能想到的唯一方法是重新分配适配器。

        【讨论】:

        • 但是BaseAdapter类中有notifyDataSetChanged方法。我添加到 ListView 的适配器是 SimpleCursorAdapter,它是 BaseAdapter 的子类 - 所以我应该能够以某种方式在 ListView onItemClick 方法中获取 SimpleCursorAdapter,对吧?
        • 如果它是 SimpleCursorAdapter 的实例,则将其类型转换为基本适配器并调用 notifyDataSetInvalidated()。
        • 问题是onItemClick事件传入一个AdapterView(parent),执行getAdapter()返回一个HeaderViewListAdapter。当我使用 getWrappedAdapter() 时,它返回一个 ListAdapter,不幸的是 BaseAdapter 是它的子类,所以即使在这种情况下,ListView 的底层适配器是 SimpleCursorAdapter,我也不能使用通知方法。如何获取对 ListView 已实现适配器的引用?
        • 你说得对,我需要对 ListAdapter 进行类型转换: HeaderViewListAdapter adapterwrap = (HeaderViewListAdapter) parent.getAdapter(); BaseAdapter 适配器 = (BaseAdapter) adapterwrap.getWrappedAdapter();
        【解决方案4】:

        当您使用光标时,您不需要调用任何方法来刷新适配器客户端。 相反,在任何操作之后,您必须使用getContentResolver().notifyChange(uri, null);“通知更改”

        例如:

        context.getContentResolver().update(SomeURI.CONTENT_URI, values, null,null);
        context.getContentResolver().notifyChange(SomeURI.CONTENT_URI, null);
        

        无论您是否使用自定义适配器,您的viewclient (Listview, Gridview, Whatever) 都会自动更改。 希望对您有所帮助。

        【讨论】:

          【解决方案5】:

          我找到了更简单的方法 ..只需调用 this.onCreate(null) 即可重新加载完整的创建方法,但活动保持不变。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-11-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-15
            • 2011-04-26
            • 1970-01-01
            相关资源
            最近更新 更多