如何在Xamarin中使用来自API的JSON更新整个ObservableCollection?

vwoqyblh  于 2023-11-15  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个移动的应用程序,3个框架内分别有3个列表视图。当我第一次打开应用程序时,它看起来正常(3个列表视图包含任务列表),但当我接受一个任务时,它必须在“待处理列表”中,在其他列表视图中:

public async Task obtenerTareas(string idAgente)
{
  
    try
    {
    
        // URL de la API que proporciona la lista de tareas
        string apiUrl = "https://tareas.sistemaonline.com.ar/rest-api/AgentesRetails?agenteRetailGET=" + idAgente;

        // Crear una instancia de HttpClient
        HttpClient client = new HttpClient();

        // Realizar una solicitud HTTP GET a la API
        HttpResponseMessage response = await client.GetAsync(apiUrl);

        // Si la solicitud fue exitosa
        if (response.IsSuccessStatusCode)
        {
            // Leer el contenido de la respuesta como una cadena JSON
            string jsonContent = await response.Content.ReadAsStringAsync();

            // Deserializar la cadena JSON en una lista de objetos de tipo Tarea
            ObservableCollection<Tarea> tareas = JsonConvert.DeserializeObject< ObservableCollection < Tarea >>(jsonContent);
            Device.BeginInvokeOnMainThread(() =>
            {
                Lista.Clear(); // Limpia la lista existente
                foreach (var tarea in tareas)
                {
                    tarea.mes = "" + Convert.ToDateTime(tarea.fecha_sol).ToString("MMMM").Substring(0, 3).ToUpper() + "";
                    tarea.dia = "  " + Convert.ToDateTime(tarea.fecha_sol).ToString("dd") + "  ";
                   // Agrega elementos a la lista existente
                }
                Lista = tareas;
            });
       
        }
        else
        {
            // Si la solicitud no fue exitosa, manejar el error según sea necesario
            await appNotificacionesPush.App2.Current.MainPage.DisplayAlert("Error al cargar las tareas" + response.StatusCode, "ok", "ok");
        }
    }
    catch (Exception ex)
    {
        await appNotificacionesPush.App2.Current.MainPage.DisplayAlert("Error" + ex.Message, "ok", "ok");

    }
 
}

字符串
但名单不会在接受某人后自动更新。

public static ICommand RefrescarCommand { get; private set; }

private bool _esRefrescando;

public bool EsRefrescando
{
    get { return _esRefrescando; }
    set
    {
        if (_esRefrescando != value)
        {
            _esRefrescando = value;
            OnPropertyChanged(nameof(EsRefrescando));
        }
    }
}
public string nombre {  get; set; }
 
private ObservableCollection<Tarea> _lista;

public ObservableCollection<Tarea> Lista
{
    get { return _lista; }
    set
    {
        if (_lista != value)
        {
            _lista = value;
            OnPropertyChanged(nameof(Lista));
        }
    }
}
private ObservableCollection<Tarea> _listaC;

public ObservableCollection<Tarea> ListaTareasCurso
{
    get { return _listaC; }
    set
    {
        if (_listaC != value)
        {
            _listaC = value;
            OnPropertyChanged(nameof(ListaTareasCurso));
        }
    }
}
private ObservableCollection<Tarea> _listaP;

public ObservableCollection<Tarea> ListaTareasPendientes
{
    get { return _listaP; }
    set
    {
        if (_listaP != value)
        {
            _listaP = value;
            OnPropertyChanged(nameof(ListaTareasPendientes));
        }
    }
}
public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public MvTareas()
{
    this.nombre = "Hola" + Preferences.Get("usuario", "");
    Lista = new ObservableCollection<Tarea>();
    ListaTareasPendientes = new ObservableCollection<Tarea>();
    ListaTareasCurso = new ObservableCollection<Tarea>();
    obtenerTareas(Preferences.Get("idAgente", ""));
    obtenerTareasP(Preferences.Get("idAgente", ""));

    obtenerTareasC(Preferences.Get("idAgente", ""));
    RefrescarCommand = new Command(ActualizarTareas);

}

public async void ActualizarTareas()
{
    await obtenerTareas(Preferences.Get("idAgente", ""));
    await obtenerTareasP(Preferences.Get("idAgente", ""));
 
    await obtenerTareasC(Preferences.Get("idAgente", ""));
    Device.BeginInvokeOnMainThread(() =>
    {
        EsRefrescando = false;
    });

}


编辑:我的xaml文件与itemsource:

<Frame HasShadow="True" Margin="10" HeightRequest="300">

     <StackLayout HorizontalOptions="FillAndExpand">
     
         <Label Text="Tareas Disponibles" FontSize="Large" HorizontalOptions="Start" Margin="0,0,0,10" />


         <ListView ItemsSource="{Binding Lista}" HasUnevenRows="True"  >
             <ListView.ItemTemplate>
                 <DataTemplate>
                     <ViewCell>
...

huwehgph

huwehgph1#

if (response.IsSuccessStatusCode)
        {
            // Leer el contenido de la respuesta como una cadena JSON
            string jsonContent = await response.Content.ReadAsStringAsync();

            // Deserializar la cadena JSON en una lista de objetos de tipo Tarea
            ObservableCollection<Tarea> tareas = JsonConvert.DeserializeObject< ObservableCollection < Tarea >>(jsonContent);
            Device.BeginInvokeOnMainThread(() =>
            {
                Lista.Clear(); // Limpia la lista existente
                foreach (var tarea in tareas)
                {
                    tarea.mes = "" + Convert.ToDateTime(tarea.fecha_sol).ToString("MMMM").Substring(0, 3).ToUpper() + "";
                    tarea.dia = "  " + Convert.ToDateTime(tarea.fecha_sol).ToString("dd") + "  ";
                   // Agrega elementos a la lista existente
                }
                Lista = tareas;
            });

字符串
从你上面发布的代码中,我们可以发现你试图将另一个地址分配给另一个对象指向的Lista(代码为Lista = tareas;)。这应该是导致数据不被刷新的原因。
你可以尝试遍历列表tareas,并将元素逐个添加到Lista中。如下所示:

Device.BeginInvokeOnMainThread(() =>
        {
            Lista.Clear(); // Limpia la lista existente
            foreach (var tarea in tareas)
            {
                tarea.mes = "" + Convert.ToDateTime(tarea.fecha_sol).ToString("MMMM").Substring(0, 3).ToUpper() + "";
                tarea.dia = "  " + Convert.ToDateTime(tarea.fecha_sol).ToString("dd") + "  ";
               // Agrega elementos a la lista existente

            // add each element to Lista one by one
             Lista.Add(tarea);

            }

           // comment out the following code
           //Lista = tareas;
        });

相关问题