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执行增删改查的例子。

先看一下效果图:

这个示例我还是拿之前的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

转载随意!

[置顶] Xamarin android 调用Web Api(ListView使用远程数据)的更多相关文章

  1. Xamarin.Android 调用Web Api(通过ListView展示远程获取的数据)

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

  2. [置顶] Xamarin android如何调用百度地图入门示例(一)

    在Xamarin android如何调用百度地图呢? 首先我们要区分清楚,百度地图这是一个广泛的概念,很多刚刚接触这个名词"百度地图api",的确是泛泛而谈,我们来看一下百度地图的 ...

  3. [置顶] Xamarin android中使用signalr实现即时通讯

    前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你 ...

  4. [置顶] xamarin android自定义spinner

    以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...

  5. [置顶] xamarin android使用gps定位获取经纬度

    看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...

  6. [置顶] xamarin android自定义标题栏(自定义属性、回调事件)

    自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...

  7. [置顶] xamarin android使用zxing扫描二维码

    好久没写了,这片文章篇幅不长,概述一下在xamarin android中用 ZXing.Net.Mobile库扫描二维码读取url的示例.扫码支付,扫码登录,App上各种各样的扫码,好像没个扫码的就有 ...

  8. [置顶] xamarin android 布局尺寸了解

    为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接  ...

  9. [置顶] xamarin android Fragment实现底部导航栏

    前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment  Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...

随机推荐

  1. JS构造函数模式

    构造函数是可以创建特定类型对象的函数,可以接受参数定义函数成员.如果之前做过java比较好理解,举个例子: function exampleFunction(arg1, arg2, arg3){ th ...

  2. A:分段函数-poj

    A:分段函数 总时间限制:  1000ms 内存限制:  65536kB 描述 编写程序,计算下列分段函数y=f(x)的值. y=-x+2.5; 0 <= x < 5 y=2-1.5(x- ...

  3. buttongroup中content一次性加载的解决方法

    buttongroup一次性加载所有内容的解决方法 如下图所示: 第一步: 设置windowcontainer的autoLoad属性为false(默认情况下autoLoad属性为true,所以会加载所 ...

  4. 【原创】python基于大数据现实双色球预测

    前提准备:利用sql筛选出每个球出现概率最高的前5个数 原理:先爬出所有的历史数据,然后模拟摇奖机出球的机制并大量模拟计算,直到出现列表中的某一个数后即停 注意事项:由于计算过程数据量很大,需要加入内 ...

  5. Mysql基础--表的操作

    1.表的基本概念 每一行代表一条唯一的记录,每一列代表记录中的一个字段. 2.创建表 例子: 3.查看表结构 (1)DESCRIBE语句查看表定义 语法: 例子: (2)SHOW CREATE TAB ...

  6. ##7.Dashboard web管理界面-- openstack pike

    ##7.Dashboard web管理界面 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.Dashboard ...

  7. SSD: Single Shot MultiBoxDetector英文论文翻译

    SSD英文论文翻译 SSD: Single Shot MultiBoxDetector 2017.12.08    摘要:我们提出了一种使用单个深层神经网络检测图像中对象的方法.我们的方法,名为SSD ...

  8. QT之TCP通信

    QT中可以通过TCP协议让服务器和客户端之间行通信.所以下面我就围绕服务器和客户端来写. 这是我么写服务器和客户端的具体流程: A.服务器: 1.创建QTcpServer对象         2.启动 ...

  9. vue——props的两种常用方法

    vue--props的两种常用方法 1.实现父-->子的通信 举例如下: 父组件 parent.vue <children :channel="object1"> ...

  10. 关于C#中函数的认识

    对于C#语言中的函数,大概分之为函数的声明及其调用. 函数的声明: 1.函数的声明是指给一段代码取名称. 2.函数的声明位置必须在类中. 3.函数声明的语法: 函数声明的语法:static void ...