Xamarin android 调用Web Api(ListView使用远程数据)

小编 2026-07-02 阅读:1638 评论:0
xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有...

xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问。xamarin android调用远程数据主要有两种方式:

  1. 在Android中保存数据或调用数据库可以利用SQLite,android中提供了几个类来管理SQLite数据库,对数据进行增删改查
  2. 直接调用Asp.net Web API对数据进行增删改查

这两种方式到底选择哪一种方式好一点呢?哪一种方式好不好我不敢确定,市场上大部分app都是调用api来clud的。当然我也推荐大家使用web api来调用远程数据,至少目前来看我们公司都是使用web api来做的。好吧废话不多说,下面就是ListView来调用web api执行增删改查的例子。

先看一下效果图:

Xamarin android 调用Web Api(ListView使用远程数据)

这个示例我还是拿之前的listview入门的例子做, xamarin android listview的用法,数据是直接调用远程的web api中的数据。主要实现步骤

  1. 新建一个web api的项目,写好要用到的方法。
  2. 在MainActivity.cs中发送请求并将相应的json字符串序列化成List集合

 web api中的 NewsControl.cs

using System.Collections.Generic;using System.Linq;using System.Net;using System.Web.Http;using WebApi10_9.Models;namespace WebApi10_9.Controllers{    public class NewsController : ApiController    {        List<News> list = new List<News>() {              new News (1001,"加内特的历史地位能在NBA排第几,超越德国战车?",1200),                new News (1002,"盘点新赛季最期待的十场比赛,无湖人比赛?",560),                new News (1003,"库里新赛季铁定无缘常规赛MVP",158200),                new News (1004,"我服,库里,杜兰特,汤普森谁才是出手的最佳选择",900),                new News (1005,"易建联的出场时间你能猜出来吗,大概多少",960),                  new News (1006,"卡戴珊三姐妹睡多少男人",960),                  new News(1007,"科比退役后湖人到底失去多少中国的粉丝",4986),                  new News(1008,"科比退役湖人签中国篮球当家背后隐藏了多少阴谋",65987)       };        public IEnumerable<News> GetAllNews()        {            return list;        }        [HttpGet]        public List<News> Remove(int id)        {            var item = list.FirstOrDefault(p => p.Id == id);            if (item == null)               throw new HttpResponseException(HttpStatusCode.NotFound);            list.Remove(item);            return list;        }    }}

MainActivity.cs

using Android.App;using Android.Content;using Android.Views;using Android.Widget;using Android.OS;using System.Collections.Generic;using DrawerLayout.Adapter;using Newtonsoft.Json;using System.Net;using System.Text;using System.IO;namespace DrawerLayout{    [Activity(Label = "ListViewDemo", MainLauncher = true, Icon = "@drawable/icon")]    public class MainActivity : Activity    {        int count = 1;        private List<News> data;        private Context context;        private NewsAdapter adapter;        private ListView lv_test;        protected override void OnCreate(Bundle bundle)        {            base.OnCreate(bundle);            SetContentView(Resource.Layout.Main);            //data = new List<News>() {            //    new News (1001,"加内特的历史地位能在NBA排第几,超越德国战车?",1200),            //    new News (1002,"盘点新赛季最期待的十场比赛,无湖人比赛?",560),            //    new News (1003,"库里新赛季铁定无缘常规赛MVP",158200),            //    new News (1004,"我服,库里,杜兰特,汤普森谁才是出手的最佳选择",900),            //    new News (1005,"易建联的出场时间你能猜出来吗,大概多少",960),            //      new News (1006,"卡戴珊三姐妹睡多少男人",960),            //      new News(1007,"科比退役后湖人到底失去多少中国的粉丝",4986),            //      new News(1008,"科比退役湖人签中国篮球当家背后隐藏了多少阴谋",65987)            //};            string url = "http://192.168.1.172:100/api/news";            string content = AccessData.GetRouteData(url ); //接收到响应的json 字符串            List<News> list = JsonConvert.DeserializeObject<List<News>>(content); //已经获取到远程数据的List<News>和之前的本地data就是一样的了。            adapter = new NewsAdapter(list,this);            lv_test = FindViewById<ListView>(Resource.Id.lv_test);            View lv_header = LayoutInflater.Inflate(Resource.Layout.lv_header, null);            lv_test.AddHeaderView(lv_header);            lv_test.Adapter = adapter;        }        public class AccessData        {            public static string GetRouteData (string url)            {                //构建请求                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);                request.ContentType = "text/json;chartset=UTF-8";                //request.UserAgent = "";                request.Method = "Get";                //接收响应                HttpWebResponse response = (HttpWebResponse)request.GetResponse();                Stream stream = response.GetResponseStream();                StreamReader streamReader = new StreamReader(stream, Encoding.UTF8);                string retString = streamReader.ReadToEnd();                return retString;            }        }    }}
当然还有一个单击删除的事件还没有写,这个在NewsAdapter.cs里面写。

        public override View GetView(int position, View convertView, ViewGroup parent)        {            convertView = LayoutInflater.From(context).Inflate(Resource.Layout.lv_test,parent,false);            ViewHolder holder = null;            if (convertView != null)            {                holder = new ViewHolder();                holder.btn = convertView.FindViewById<Button>(Resource.Id.btn_delete);                holder.title = convertView.FindViewById<TextView>(Resource.Id.tv_title);                holder.pv = convertView.FindViewById<TextView>(Resource.Id.tv_pv);            }            else            {                convertView.Tag = holder;            }            holder.pv.Text = data[position].Pv.ToString();            holder.title.Text = data[position].Title;            holder.btn.Click += (s, e) => DeleteClick(data[position].Id,position);            return convertView;        }        public void DeleteClick(int id,int position)        {            string url = "http://192.168.1.172:100/api/news/"+id;            string content = AccessData.GetRouteData(url); //已经接收到响应的json 字符串             Toast.MakeText(context,data[position].Title+"删除成功",ToastLength.Short).Show();            List<News> list = JsonConvert.DeserializeObject<List<News>>(content);            data = list;            NotifyDataSetChanged();        }    }    public class ViewHolder:Java.Lang.Object    {        public TextView title;        public TextView pv;        public Button btn;    }

好了,这样就大功告成了。那么问题来了,上面发送http请求,然后又接收响应再序列化,这还仅仅是一个简单的例子,要是复杂实用一点的话,要写很多很多代码,这里我推荐一个非常好的第三方组件,http请求响应第三方组件RestSharp用的非常广泛。用法很简单,看完这篇大概你就懂了RestSharp的10分钟入门实例。我为什么推荐大家使用这个第三方组件呢,因为本屌所在公司也是用这个的,好东西,就是要懂得分享,当然那种直接利用HttpWebRequest ,HttpWebResonse对象来获取文件流再序列化成List集合的原始方法肯定是要知道的。直接上代码,结果还是一样的。哦,先先Nuget下载RestSharp 才能引用。


   protected override void OnCreate(Bundle bundle)        {            base.OnCreate(bundle);            SetContentView(Resource.Layout.Main);            string url = "http://192.168.1.172:100/api/news";           <span style="color:#ff0000;"> var client = new RestClient(url);//创建客户端请求            var request = new RestRequest();            //RestResponse response = (RestResponse)client.Execute(request);            //string responseStr = response.Content; 这两句获取json字符串,下面两句获取集合也很简洁            IRestResponse<List<News>> responseList = client.Get<List<News>>(request);            List<News> list = responseList.Data;</span>            //string content = AccessData.GetRouteData(url ); //接收到响应的json 字符串            //List<News> list = JsonConvert.DeserializeObject<List<News>>(content); //已经获取到远程数据的List<News>和之前的本地data就是一样的了。            adapter = new NewsAdapter(list,this);            lv_test = FindViewById<ListView>(Resource.Id.lv_test);            View lv_header = LayoutInflater.Inflate(Resource.Layout.lv_header, null);            lv_test.AddHeaderView(lv_header);            lv_test.Adapter = adapter;        }

删除也是差不多的,所以不贴了,只需要这几句就可以了实现发送请求接收响应了。大力推荐使用RestSharp。代码下载址:xamarin android listview调用web api

作者:张林

原文地址:http://blog.csdn.net/kebi007/article/details/52770808

转载随意!


版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表