Как создать панель поиска, которая будет искать по JSON в списке - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть панель поиска, которая показывает пустой список, когда я что-то пишу в нем, десериализацию в ItemPage и SearchBar_TextChanged. Весь файл выглядит следующим образом:

using System.ComponentModel;
using Xamarin.Forms;
using Diabetics.Models;
using Diabetics.ViewModels;
using System.Linq;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Threading.Tasks;
using Plugin.Connectivity;
using System.Net.Http;
using Newtonsoft.Json;
using System;
using System.Windows.Input;

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

        }

        private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(e.NewTextValue))
            {
                ItemsListView.ItemsSource = itemlist.ToList();
            }
            else
            {
                ItemsListView.ItemsSource = itemlist.Where(x => x.Nazwa.Contains(e.NewTextValue)).ToList();
            }
        }

        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));

            ItemsListView.SelectedItem = null;
        }

        private async void ToolbarItem_ClickedAsync(object sender, EventArgs e)
        {
            await Navigation.PushAsync(new FullScreenScanning());
        }

        private 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;
            var itemlist = JsonConvert.DeserializeObject<ObservableCollection<Item>>(result);
            ItemsListView.ItemsSource = itemlist;
        }


    } 
}

Моя поисковая панель в XAML выглядит следующим образом <SearchBar Text="" Placeholder="Wyszukaj..." TextChanged="SearchBar_TextChanged" x:Name="searchbarnew"/> Я хочу, чтобы он отображал элементы с таким же Nazwa как e.NewTextValue mine Json File выглядит следующим образом:

[
  {
    "Nazwa": "Czekolada mleczna Sport & Fitness",
    "Opis": "Przykładowy opis produktu Czekolada mleczna Sport & Fitness",
    "Zdjecie": "https://www.friars.co.uk/images/lindt-gold-milk-chocolate-bar-p504-7263_image.jpg",
    "WW": 0.28,
    "WBT": 0.22,
    "Energia": 31.8125,
    "Tluszcz": 2.19375,
    "Weglowodany": 3.225,
    "Blonnik": 0.11875,
    "Bialko": 0.45625,
    "Zelazo": 0.1875,
    "Wapn": 15.5
  },
  {
    "Nazwa": "Czekolada mleczna Sport & Fitness2",
    "Opis": "Przykładowy opis produktu Czekolada mleczna Sport & Fitness2",
    "Zdjecie": "https://vaya.in/recipes/wp-content/uploads/2018/02/Milk-Chocolate-1.jpg",
    "WW": 0.16,
    "WBT": 0.21,
    "Energia": 28.5625,
    "Tluszcz": 2.19375,
    "Weglowodany": 2.94375,
    "Blonnik": 0.4875,
    "Bialko": 0.34375,
    "Zelazo": 0.8125,
    "Wapn": 0
  }
]

Он должен отображать элементы с тем же именем, что и e.NewTextValue, например, если мы ищем Fitness2 , он должен показывать только один элемент списка. Теперь он пуст, и я не ошибаюсь.

1 Ответ

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

вы переделываете itemlist как локальную переменную вместо того, чтобы использовать уже существующую переменную уровня класса

 waitActivityIndicator.IsVisible = false;
 var itemlist = JsonConvert.DeserializeObject<ObservableCollection<Item>>(result);
 ItemsListView.ItemsSource = itemlist;

удалить var

 waitActivityIndicator.IsVisible = false;
 itemlist = JsonConvert.DeserializeObject<ObservableCollection<Item>>(result);
 ItemsListView.ItemsSource = itemlist;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...