Как обновить ListView при обнаружении QR-кода? - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь показать элементы в ListView, которые имеют точное имя в виде QR-кода. Я использую ZXing и список показан из десериализации файла JSON на сайте. Мой код, который обрабатывает результат QR-кода:

public void Handle_OnScanResult(Result result)
{

    string wynik = result.Text;
    ItemPage P = new ItemPage();
    Application.Current.MainPage.Navigation.PopModalAsync();
    P.Receive_result(wynik);

}

Он принимает результат. Текст как wynik , закрывает окно с камерой и отправляет его на этот код:

public void Receive_result(string wynik)
{
    ItemsListView.ItemsSource = itemlist.Where(x => x.Nazwa.Equals(wynik));
}

Когда он читает QR-код, значение сохраняется и отправляется в Receive_result, но список не обновляется. Весь код, который отвечает за отображение ListView и десериализацию объекта:

using System.ComponentModel;
using Xamarin.Forms;
using Diabetics.Models;
using System.Linq;
using System.Collections.ObjectModel;
using System.Net.Http;
using Newtonsoft.Json;
using System;

namespace Diabetics.Views
{
    [DesignTimeVisible(false)]
    public partial class ItemPage : ContentPage
    {
        public ObservableCollection<Item> itemlist = new ObservableCollection<Item>();
        public ItemPage()
        {
            InitializeComponent();
            LoadAll();

            ItemsListView.RefreshCommand = new Command(() => {
                LoadAll();
                ItemsListView.IsRefreshing = false;
            });

        }
//code to receive value wynik and update list
        public void Receive_result(string wynik)
        {
                ItemsListView.ItemsSource = itemlist.Where(x => x.Nazwa.Equals(wynik));

        }
//searchbar
        public void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(e.NewTextValue))
            {
                ItemsListView.ItemsSource = itemlist;
            }
            else
            {
                ItemsListView.ItemsSource = itemlist.Where(x => x.Nazwa.Contains(e.NewTextValue));
            }
        }
//On click to show item details
        async void OnItemSelected(object sender, SelectedItemChangedEventArgs args)
        {
            if (!(args.SelectedItem is Item item))
                return;

            await Navigation.PushAsync(new ItemDetailPage(item.Nazwa, item.Opis, item.Zdjecie, item.WW, item.WBT, item.Energia, item.Tluszcz, item.Weglowodany, item.Blonnik, item.Bialko, item.Zelazo, item.Wapn, item.Code));

            ItemsListView.SelectedItem = null;
        }
//Button to show camera
        private async void ToolbarItem_ClickedAsync(object sender, EventArgs e)
        {
            await Navigation.PushModalAsync(new FullScreenScanning());
        }

//Json Deserialization
        public async void LoadAll()
        {
            waitActivityIndicator.IsRunning = true;
            waitActivityIndicator.IsVisible = true;
            string result = string.Empty;
            try
            {
                HttpClient Klient = new HttpClient();
                Klient.BaseAddress = new Uri("https://next.json-generator.com");
                string url = string.Format("/api/json/get/4yvwrz2bd");
                var response = await Klient.GetAsync(url);
                result = response.Content.ReadAsStringAsync().Result;

            }
            catch (Exception ex)
            {
                await DisplayAlert("Error", string.Format("Musisz być podłączony do internetu", ex.Message), "OK");
                waitActivityIndicator.IsRunning = false;
                waitActivityIndicator.IsVisible = false;
            }
            waitActivityIndicator.IsRunning = false;
            waitActivityIndicator.IsVisible = false;
            itemlist = JsonConvert.DeserializeObject<ObservableCollection<Item>>(result);
            ItemsListView.ItemsSource = itemlist;
        }
    } 
}

1 Ответ

0 голосов
/ 07 февраля 2020

MessagingCenter будет идеальным способом сделать это, но вы также можете передать ссылку на родительскую страницу

await Navigation.PushModalAsync(new FullScreenScanning(this));

в конструкторе, сохранить ссылку

ItemPage Parent;

public FullScreenScanning(ItemsPage parent)
{
  this.Parent = parent;
}

затем

public void Handle_OnScanResult(Result result)
{
   string wynik = result.Text;
   Parent.Receive_result(wynik);
   Application.Current.MainPage.Navigation.PopModalAsync();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...