C# 检测到二维码时如何更新ListView?
我正在尝试在ListView中显示具有QR码确切名称的项目。我正在使用ZXing,该列表显示在网站上反序列化JSON文件的过程中。处理二维码结果的矿山代码为:C# 检测到二维码时如何更新ListView?,c#,xamarin,C#,Xamarin,我正在尝试在ListView中显示具有QR码确切名称的项目。我正在使用ZXing,该列表显示在网站上反序列化JSON文件的过程中。处理二维码结果的矿山代码为: public void Handle_OnScanResult(Result result) { string wynik = result.Text; ItemPage P = new ItemPage(); Application.Current.MainPage.Navigation.PopModalAsy
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));
}
当它读取二维码时,存储并发送值以接收结果,但它不会更新列表。
下面是负责显示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;
}
}
}
使用System.ComponentModel;
使用Xamarin.Forms;
使用糖尿病患者。模型;
使用System.Linq;
使用System.Collections.ObjectModel;
使用System.Net.Http;
使用Newtonsoft.Json;
使用制度;
名称空间糖尿病患者。视图
{
[设计时间可见(错误)]
公共部分类ItemPage:ContentPage
{
public ObservableCollection itemlist=新的ObservableCollection();
公共项目页()
{
初始化组件();
LoadAll();
ItemsListView.RefreshCommand=新命令(()=>{
LoadAll();
ItemsListView.IsRefreshing=false;
});
}
//接收值wynik和更新列表的代码
公共无效接收结果(字符串wynik)
{
ItemsListView.ItemsSource=itemlist.Where(x=>x.Nazwa.Equals(wynik));
}
//搜索栏
public void SearchBar_TextChanged(对象发送者,textchangedventargs e)
{
if(string.IsNullOrWhiteSpace(e.NewTextValue))
{
ItemsListView.ItemsSource=itemlist;
}
其他的
{
ItemsListView.ItemsSource=itemlist.Where(x=>x.Nazwa.Contains(e.NewTextValue));
}
}
//单击以显示项目详细信息
已选择异步(对象发送方,SelectedItemChangedEventArgs args)
{
如果(!(args.SelectedItem为项目))
返回;
等待Navigation.PushAsync(新的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;
}
//显示照相机的按钮
私有异步无效工具栏项\u ClickedAsync(对象发送方,事件参数e)
{
等待导航。PushModalAsync(新的全屏扫描());
}
//Json反序列化
公共异步void LoadAll()
{
waitActivityIndicator.IsRunning=true;
waitActivityIndicator.IsVisible=true;
字符串结果=string.Empty;
尝试
{
HttpClient Klient=新的HttpClient();
Klient.BaseAddress=新Uri(“https://next.json-generator.com");
stringurl=string.Format(“/api/json/get/4yvwrz2bd”);
var response=await Klient.GetAsync(url);
结果=response.Content.ReadAsStringAsync().result;
}
捕获(例外情况除外)
{
等待显示警报(“错误”,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(结果);
ItemsListView.ItemsSource=itemlist;
}
}
}
是实现这一点的理想方法,但您也可以将引用传递到父页面
await Navigation.PushModalAsync(new FullScreenScanning(this));
在构造函数中,存储引用
ItemPage Parent;
public FullScreenScanning(ItemsPage parent)
{
this.Parent = parent;
}
然后
您是否调试了
Receive\u result
以验证它是否正在接收数据,以及LINQ查询是否实际返回结果?你试过在UI线程上执行代码吗?@Jason它正在接收数据,但正如我看到的,LINQ query没有返回任何内容,我如何在UI线程上执行它?如果查询不起作用,那就是你的问题。修正firstitemlist count=0,但“wynik”的确切值为QR码,listview中有一个项目看起来是这样的,您的扫描页面如何调用Receive_result
?当你调用FullScreenScan
时,你似乎没有传递对页面的引用。我这样做了,它说当前上下文中不存在父对象。你是否将其命名为“父对象”或“父对象”?我尝试了“父对象”,但它甚至没有关闭FullScreenScan,它只是在调试窗口告诉我BarcodeFoundI不能在调试的每一步都握住你的手。它在执行Pop吗?ItemsPage是否收到代码?也许先打电话给Pop,然后再收到结果。我很抱歉。我在收到结果之前就有过,我认为这是错误的。谢谢它的工作,但我需要点击屏幕上的某个地方刷新它,有办法自动显示这个项目吗?
public void Handle_OnScanResult(Result result)
{
string wynik = result.Text;
Parent.Receive_result(wynik);
Application.Current.MainPage.Navigation.PopModalAsync();
}