Monodroid ListView更新问题

时间:2012-02-10 13:19:18

标签: c# android listview xamarin.android

刚开始使用Monodroid,我目前正在使用ListView。 我有一个List添加到ArrayAdapter,我可以正确看到我的前两个项目。但是,当我向列表中添加第三个元素时,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

我错过的任何线索?

5 个答案:

答案 0 :(得分:2)

我自己在另一个论坛找到了解决方案。不知何故,ArrayAdapter在使用List时没有注意到列表更改。而是使用Android.Runtime.JavaList。

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

像魅力一样! :)

答案 1 :(得分:0)

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

la.Add(" Test3");

如果您希望保持列表相同,则必须将其添加到list

答案 2 :(得分:0)

试试这个添加la.notifyDataSetInvalidated();在la.NotifyDataSetChanged();

之后

答案 3 :(得分:0)

我不确定这会对任何人有多大帮助,但它似乎在我的实例中运作良好。

我有一个ViewModel类,它保存我在App中更新的所有数据,并在集合发生变化时触发“Collection Updated”操作。

// 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作为列表视图的数据上下文。希望有帮助,并且足够让每个人都能理解。

答案 4 :(得分:0)

更新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);
    }