2014-09-30 3 views
0

Я новичок в Xamarin, и я пытаюсь обновить свой MainActivity от себя. Я читал много форумов об этом, но я до сих пор не могу найти решение. Моя проблема в том, что мне нужно сделать обновление из другого метода, а не в методе onCreate().Обновить текущую активность в Xamarin

Мой MainActivity - это listview, и я хочу перезагрузить всю активность, чтобы обновить список. Мне нужно перезагрузить всю деятельность, потому что в моей ситуации я не могу использовать NotifyDataSetChanged(), потому что изменения, которые я делаю для listview, не входят в метод onCreate(), а не в новую активность. У меня есть меню CAB, где у пользователя есть возможность удалить выбранную заметку из списка. Я использую метод NotifyDataSetChanged() в моем методе onResume(), и он отлично работает, когда я вношу изменения в свой listview в другой активности, но он не работает, когда я делаю их из текущей активности, потому что метод onResume() не вызывается.

Я пытался делать это так:

Intent refresh = new Intent(this,typeof(MainActivity)); 
refresh.AddFlags(ActivityFlags.NoAnimation); 
Finish(); 
StartActivity(refresh); 

, но это дает мне NullPointerException на первом ряду уже .. И исключение я думаю, это «это». Поэтому я попробовал это по-другому: вместо использования этого «я» использую - Intent refresh = new Intent(context ,typeof(MainActivity)); где context = this в методе onCreate(). Но таким образом он все еще дает мне NullPointerException, но на этот раз в строке - StartActivity(refresh) ..

Заранее спасибо! :)

+0

'NotifyDataSetChanged' наиболее определенно работает за пределами' OnCreate'/'OnResume' переопределениях. – Johan

+0

Да, это работает, но я инициализировал свой адаптер в методе onCreate. И я не знаю, как использовать его вне метода onCreate(). –

+0

См. Мой ответ, это небольшой пример, но он будет работать. – Johan

ответ

0

NotifyDataSetChanged() наиболее определенно работает за пределами OnCreate/OnResume и т.д. переопределяет

Если вы хотите использовать NotifyDataSetChanged(), вам необходимо будет изменить элементы в ListAdapter, что связано с ListView.

Что-то вроде этого

namespace MyNamespace 
{ 
    [Activity] 
    public MyActivity : Activity 
    { 

     private ArrayAdapter<string> myAdapter = null; 

     public override void OnCreate(Bundle savedInstanceState) 
     { 
      myAdapter = new ArrayAdapter<string>(); //or whatever type your adapter is. 
      myListView.Adapter = myAdapter; 
     } 

     private void UpdateList() 
     { 
      //Delete item 
      myAdapter.Remove(item); 

      //Insert item 
      myAdapter.Insert(item, 0); //0 = position for new item 

      //Add item 
      myAdapter.Add(item); 

      myAdapter.NotifyDataSetChanged(); 
     } 
    } 
} 
+0

Да, но если я хочу использовать myAdapter.NotifyDataSetChanged() в другом методе, чем onCreate(), тогда у вас будет NullPointerException .. Потому что даже так, как вы это делаете, вы создаете экземпляр адаптера внутри onCreate() .. –

+0

Нет , потому что это глобальное поле (область действия класса), оно не будет равно нулю. – Johan

+0

У меня теперь есть исключение NullReferenceException. –

0

Thisi является код:

public List<DeliveryNoteInfo> _lstNoteInfo = new List<DeliveryNoteInfo>(); 
    public ObjectToSerialize objectToSerialize; 
    public Serializer serializer; 
    private ListView objListItem; 
    private MonoBaseAdapter2 myAdapter = null; 
    static AlertDialog levelDialog; 
    static string[] items; 
    static Context context2; 

    protected override void OnCreate (Bundle SavedInstanceState) 
    { 
     base.OnCreate (SavedInstanceState); 

     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.Main); 
     // Get our UI controls from the loaded layout 
     Button addButton = FindViewById<Button>(Resource.Id.AddButton); 
     addButton.Click += delegate { 
      StartActivity (typeof(AddActivity)); 
     }; 
     Button sortButton = FindViewById<Button>(Resource.Id.SortButton); 
     sortButton.Click += delegate { 
      ShowSortDialog(_lstNoteInfo); 
     }; 
     Button exitButton = FindViewById<Button>(Resource.Id.ExitButton); 
     exitButton.Click += delegate { 
      Finish(); 
     }; 
     context2 = this; 
     // Loading the already saved notes from external file 
     objectToSerialize = new ObjectToSerialize(); 
     serializer = new Serializer(); 
     var path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData); 
     if (System.IO.File.Exists (path + "outputFile.txt")) { 
      deserialize(); 
     } 
     //Displaying the Notes in a custom made ListView 
     objListItem = FindViewById<ListView> (Resource.Id.listView1); 
     myAdapter = new MonoBaseAdapter2 (this, _lstNoteInfo); 
     objListItem.Adapter = myAdapter; 
     objListItem.FastScrollEnabled = true; 
     objListItem.ChoiceMode = (ChoiceMode)AbsListViewChoiceMode.MultipleModal; 
     objListItem.SetMultiChoiceModeListener (new CabMenu(this,this,objListItem)); 


     objListItem.ItemClick += delegate(object sender, AdapterView.ItemClickEventArgs e) { 
      var itemClicked = new Intent(this,typeof(InfoActivity)); 
      itemClicked.PutExtra("File name",_lstNoteInfo[e.Position].ImageID); 
      itemClicked.PutExtra("Date",_lstNoteInfo[e.Position].Date); 
      itemClicked.PutExtra("Type",_lstNoteInfo[e.Position].Type); 
      itemClicked.PutExtra("Name",_lstNoteInfo[e.Position].Name); 
      itemClicked.PutExtra("Supplier",_lstNoteInfo[e.Position].Supplier); 
      itemClicked.PutExtra("Amount",_lstNoteInfo[e.Position].Amount); 
      itemClicked.PutExtra("Info",_lstNoteInfo[e.Position].AddInfo); 
      StartActivity (itemClicked); 
     }; 

    } 

    protected override void OnResume() 
    { 
     base.OnResume(); 
     var lstNoteInfo = new List<DeliveryNoteInfo>(); 
     var path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData); 
     if (System.IO.File.Exists (path + "outputFile.txt")) { 
      objectToSerialize = serializer.DeSerializeObject ("outputFile.txt"); 
      lstNoteInfo = objectToSerialize.DeliveryNoteInfo; 
     } 
     _lstNoteInfo.Clear(); 
     _lstNoteInfo.AddRange (lstNoteInfo); 
     ((MonoBaseAdapter2)objListItem.Adapter).NotifyDataSetChanged(); 
     objListItem.Invalidate(); 
     ((MonoBaseAdapter2)objListItem.Adapter).NotifyDataSetInvalidated(); 

    } 

    public void makeNote (String fileName, String finalDate, String type,String noteName, String amount, String supplier, String addInfo) 
    { 
     _lstNoteInfo.Add (new DeliveryNoteInfo(){ ImageID = fileName, Date = finalDate,Type = type, Name = noteName, Amount = amount, Supplier = supplier, AddInfo = addInfo}); 
     objectToSerialize.DeliveryNoteInfo = _lstNoteInfo; 
     serializer.SerializeObject("outputFile.txt", objectToSerialize); 
     Console.WriteLine ("Name: " + noteName); 
     Console.WriteLine ("Amount: " + amount); 
    } 
    public void RefreshAfterDelete(List<DeliveryNoteInfo> updatedList) 
    { 
     _lstNoteInfo.Clear(); 
     _lstNoteInfo.AddRange (updatedList); 
     objectToSerialize.DeliveryNoteInfo = _lstNoteInfo; 
     serializer.SerializeObject("outputFile.txt", objectToSerialize); 
     UpdateList(); 
    } 
    public void PrintCollection<T>(IEnumerable<T> col) 
    { 
     foreach(var item in col) 
      System.Console.WriteLine("ITEM"); 
    } 
    void deserialize() 
    { 
     objectToSerialize = serializer.DeSerializeObject ("outputFile.txt"); 
     _lstNoteInfo = objectToSerialize.DeliveryNoteInfo; 
    } 
    void deserialize(List<DeliveryNoteInfo> list) 
    { 
     objectToSerialize = serializer.DeSerializeObject ("outputFile.txt"); 
     list = objectToSerialize.DeliveryNoteInfo; 
    } 
    void serialize (List<DeliveryNoteInfo> list) 
    { 
     objectToSerialize.DeliveryNoteInfo = list; 
     serializer.SerializeObject("outputFile.txt", objectToSerialize); 
    } 
    private void ShowSortDialog(List<DeliveryNoteInfo> updatedList) 
    { 

     // Strings to Show In Dialog with Radio Buttons 
     items = new string[]{" Date "," Name "," Type of delivery "," Supplier "}; 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.SetTitle("Sort by .."); 
     builder.SetSingleChoiceItems(items, -1, onClick); 
     levelDialog = builder.Create(); 
     levelDialog.Show(); 
    } 
    public void onClick(object sender, DialogClickEventArgs e) { 
     var item = (int) e.Which; 
     List<DeliveryNoteInfo> list = new List<DeliveryNoteInfo>(); 
     switch(item) 
     { 
     case 0: 
      // Your code when first option seletced 
      Console.WriteLine ("Sorting by date.."); 
      break; 
     case 1: 
      // Sorting by name 
      objectToSerialize = serializer.DeSerializeObject ("outputFile.txt"); 
      list = objectToSerialize.DeliveryNoteInfo; 
      List<DeliveryNoteInfo> SortedList = list.OrderBy (o => o.Name).ToList(); 
      RefreshAfterDelete (SortedList); 
      Console.WriteLine ("Sorting by name.."); 
      break; 
     case 2: 
      // Your code when 3rd option seletced 
      Console.WriteLine ("Sorting by type of delivery.."); 
      break; 
     case 3: 
      // Your code when 4th option seletced 
      Console.WriteLine ("Sorting by supplier .."); 
      break; 

     } 
     levelDialog.Dismiss();  
    } 
    private void ListClicked (object sender, DialogClickEventArgs e) 
    { 
     var builder = new AlertDialog.Builder (this); 
     builder.SetMessage (string.Format ("You selected: {0} , {1}", (int)e.Which, items [(int)e.Which])); 

     builder.Show(); 
    } 
    private void UpdateList() 
    { 
     myAdapter.NotifyDataSetChanged(); 
    } 
} 
+0

Я пытаюсь обновить его в методе RefreshAfterDelete(). –

+0

Является ли 'objListItem' также нулевым в этом методе? – Johan

+0

Если я попытаюсь сделать это вот так: ((MonoBaseAdapter2) objListItem.Adapter) .NotifyDataSetChanged(); он все еще дает мне [NullReferenceException], следовательно, он также является нулевым. –

Смежные вопросы