Monodroid ListView更新问题

本文关键字:新问题 更新 ListView Monodroid | 更新日期: 2023-09-27 18:23:57

刚开始使用Monodroid,我目前正在开发ListView。我在ArrayAdapter中添加了一个List,我可以正确地看到我的前两个项目。但是,当我向列表中添加第三个元素时,listview不会更新。尽管我调用了notifyDataSetChanged()。

private ArrayAdapter<string> la;
private ListView list;
private List<String> dayData = new List<String>();
protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            this.SetContentView(Resource.Layout.TestLayout);

            dayData.Add(" Test");
            dayData.Add(" Test2"); // Theese two elements shows up fine
            list = this.FindViewById<ListView>(Resource.Id.menuList);
            la = new ArrayAdapter<string>(this, Resource.Layout.list_item, dayData);
            list.Adapter = la;
            list.TextFilterEnabled = true;
            dayData.Add(" Test3"); // This one is not shown
            la.NotifyDataSetChanged();

        } // OnCreate

我遗漏了什么线索吗?

Monodroid ListView更新问题

我在另一个论坛上找到了一个解决方案。不知怎的,ArrayAdapter在使用list时不会注意到列表的更改。相反,使用Android.Runtime.JavaList.

您可以在此处找到讨论:http://mono-for-android.1047100.n5.nabble.com/Update-ListView-when-dataset-changes-td4757874.html

工作起来很有魅力!:)

我不完全确定,但我认为项目已复制到ArrayAdapter中,因此您需要做的是:

la.Add(" Test3");

如果你想保持列表不变,你也必须将其添加到list中。

尝试此Add-la.notifyDataSetInvalidated();在la.NotifyDataSetChanged()之后;

我不确定这对任何人都有多大帮助,但在我的例子中似乎效果很好。

我有一个ViewModel类,它将我更新的所有数据保存在应用程序中,并在集合更改时触发"更新集合"操作。

// All within ViewModel.cs
private Action SearchResultsUpdated;
private List<SearchResult> m_oSearchResults;
Public List<SearchResult> SearchResults
{
    get
    {
        if (m_oSearchResults == null)
            m_oSearchResults = new List<SearchResult> ();
        return m_oSearchResults;
    }
    set
    {
        if (value != m_oSearchResults)
        {
            m_oSearchResults = value;
            //
            // Fire update event
            if (SearchResultsUpdated != null)
                SearchResultsUpdated ();
        }
    }
}

然后,我在适配器类中为该事件添加一个处理程序。

// All within SearchResultsAdapter.cs
public class SearchResultsAdapter : BaseAdapter<SearchResult>
{
.
.
    // Constructor
    public SearchResultsAdapter (Activity oContext)
        : base ()
    {
        // Add handler for list refresh
        ViewModel.SearchResultsUpdated += NotifyDataSetChanged;
        //
        m_oContext = oContext;
    }
}

在适配器中,我使用集合ViewModel.SearchResults作为列表视图的数据上下文。希望这能有所帮助,而且足够彻底,让每个人都能理解。

更新ListView

private ListView lvAnuncios = null;
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        this.lvAnuncios = this.FindViewById<ListView>(Resource.Id.MisAnuncios_lvAnuncios);
    }
    private void ReloadListView()
    {
        if (this.lvAnuncios.Adapter != null)
        {
            this.lvAnuncios.Adapter.Dispose();
            this.lvAnuncios.Adapter = null;
        }
                                      //Class that inherits  de ArrayAdapter
        this.lvAnuncios.Adapter = new adAnuncio(this, Resource.Layout.FilaListViewAnuncio, csVariable.objUsr.lstAnuncios);
    }