1

我的ListView. 这是场景:

我正在使用 MVP 设计模式。在Activity开始时,它会引发一个事件来通知演示者从 Web 服务中获取一些数据。Web 服务调用是异步调用。一旦Completed引发 Web 服务事件,我将结果推送到我的View/中的一个属性(数组类型)中Activity

我提到的一切都很好,但是一旦设备旋转,就会发生一些有趣的发展。

异步调用正常恢复并为属性 (Array) 提供一个值。所以那里没有错......(是的,集合中有数据)然后我设置ListView Adapter并调用了notifyDataSetChanged,但没有任何反应。用户界面没有更新还是什么?如果我重新输入Activity数据再次可见??

我什至尝试打电话invalidateViewsinvalidate-ListView这没有做任何事情。

有人可以在这件事上帮助我吗?提前谢谢了!

[更新]

我想强调一个事实,即我使用的是 C# (Xamarin) 而不是 Java (:sigh: - 是的,我知道)。此外,我没有使用ASyncTask该类,而是使用在 Visual Studio 生成的代理类中创建的异步方法。非常简单,但这是填充的代码ListView- 属性是从演示者设置的

主持人

View 的类型为 IContactsView

    protected override void OnCollectData(System.Collections.IEnumerable data, Type typeOfData)
    {
        if (data != null && typeOfData != null && typeOfData.Equals(typeof(UserContact)))
        {
            this.View.UserInformationCollection = data.Cast<UserContact>().ToArray();
        }
    }

活动

该活动实现了 IContactsView

    public UserContact[] UserInformationCollection
    {
        get
        {
            return this._userInformationCollection;
        }
        set 
        {
            this.RunOnUiThread(() =>
                {
                    this._userInformationCollection = value;                        
                    ListView listview = this.FindViewById<ListView>(Resource.Id.userLV);
                    if (listview != null)
                    {                           
                        UserContact[] subsidiesList = this.GetIndexedContacts(this._userInformationCollection);
                        listview.Adapter = new ContactsAdapter(this, subsidiesList.ToList());
                        ((ContactsAdapter)listview.Adapter).NotifyDataSetChanged();
                    }
                });
        }
    }

[/更新]

4

2 回答 2

2

找到了更好的解决方案!所以请忽略这个static variable想法!

活动:

覆盖OnRetainNonConfigurationInstance并返回演示者

    public override Java.Lang.Object OnRetainNonConfigurationInstance()
    {
        return this._presenter;
    }

OnCreate检查中LastNonConfigurationInstance并获取演示者 - 如果它不为空:

    protected override void OnCreate(Bundle bundle)
    {
        ...
        if (this.LastNonConfigurationInstance != null)
        {
            this._presenter = this.LastNonConfigurationInstance as ContactsPresenter;
            this._presenter.RefreshView(this);
        }
        else
        {
            // create a new presenter
            this._presenter = new ContactsPresenter(this);
        }
        ...
    }

所以也许,你看到我在前面的代码示例中做了什么?是的,我将活动的新实例发送给演示者 - 看看RefreshView

主持人:

所以在我的基础演示者中,我有以下方法:

public class Presenter<T> : Java.Lang.Object, IPresenter where T : IView
{
    /// <param name="view">The view.</param>
    public void RefreshView(T view)
    {
        this.View = view;
    }
}

上面的代码帮助我的演示者说创建新活动 - 所以当它在异步调用后返回数据时,它将拥有最新和最好的活动实例!

希望这可以帮助!亲切的问候,

于 2012-11-23T07:21:22.070 回答
1

通过执行以下操作使其工作:

声明活动的静态变量:

    private static ContactsActivity _cachedActivity = null;

覆盖OnResume活动内部并设置变量:

    protected override void OnResume()
    {
        base.OnResume();
        _cachedActivity = this;
    }

覆盖OnCreate活动内并设置变量:

    protected override void OnCreate(Bundle bundle)
    {
        ...
        _cachedActivity = this;
        ...
    }

最后我更改了前面提到的属性:

    public USBUserContact[] UserInformationCollection
    {
        get
        {
            return this._userInformationCollection;
        }
        set
        {
            _cachedActivity.RunOnUiThread(() =>
                {
                    _cachedActivity._userInformationCollection = value;
                    ListView listview = _cachedActivity.FindViewById<ListView>(Resource.Id.userLV);
                    if (listview != null)
                    {
                        UserContact[] subsidiesList = _cachedActivity.GetIndexedContacts(_cachedActivity._userInformationCollection);
                        listview.Adapter = new ContactsAdapter(_cachedActivity, subsidiesList.ToList());
                        ((ContactsAdapter)listview.Adapter).NotifyDataSetChanged();
                    }
                });
        }
    }

亲切的问候,

于 2012-11-22T11:23:47.230 回答