[置顶] Xamarin android 调用Web Api(ListView使用远程数据)
xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问。xamarin android调用远程数据主要有两种方式:
在Android中保存数据或调用数据库可以利用SQLite,android中提供了几个类来管理SQLite数据库,对数据进行增删改查
直接调用Asp.net Web API对数据进行增删改查
这两种方式到底选择哪一种方式好一点呢?哪一种方式好不好我不敢确定,市场上大部分app都是调用api来clud的。当然我也推荐大家使用web api来调用远程数据,至少目前来看我们公司都是使用web api来做的。好吧废话不多说,下面就是ListView来调用web api执行增删改查的例子。
先看一下效果图:
这个示例我还是拿之前的listview入门的例子做,xamarin android listview的用法,数据是直接调用远程的web api中的数据。主要实现步骤
- 新建一个web api的项目,写好要用到的方法。
- 在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使用远程数据)的更多相关文章
- Xamarin.Android 调用Web Api(通过ListView展示远程获取的数据)
xamarin.android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin.android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...
- [置顶]
Xamarin android如何调用百度地图入门示例(一)
在Xamarin android如何调用百度地图呢? 首先我们要区分清楚,百度地图这是一个广泛的概念,很多刚刚接触这个名词"百度地图api",的确是泛泛而谈,我们来看一下百度地图的 ...
- [置顶]
Xamarin android中使用signalr实现即时通讯
前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你 ...
- [置顶]
xamarin android自定义spinner
以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...
- [置顶]
xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...
- [置顶]
xamarin android自定义标题栏(自定义属性、回调事件)
自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...
- [置顶]
xamarin android使用zxing扫描二维码
好久没写了,这片文章篇幅不长,概述一下在xamarin android中用 ZXing.Net.Mobile库扫描二维码读取url的示例.扫码支付,扫码登录,App上各种各样的扫码,好像没个扫码的就有 ...
- [置顶]
xamarin android 布局尺寸了解
为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接 ...
- [置顶]
xamarin android Fragment实现底部导航栏
前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...
随机推荐
- 使用语句清除sqlserver数据库日志文件
修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可 SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes I ...
- 从今天起开始记录下在freecodecamp学习的一些tip吧(所有内容都在这个随笔的评论里面记录)
因为可能东西会很零碎 所以就放在随笔里吧 当需要在字符串中使用一个: " 或者 ' 时 可以通过在引号前面使用 反斜杠 (\) 来转义引号. var sampleStr = "Al ...
- C语言之赋值
#include<stdio.h>/*void change(int m,int n){ int t; t=m; m=n; n=t;}*/int main(){//交换两杯水,需要一个空杯 ...
- git使用(上)-----基本的方法
git应该是一项必须要掌握的工具.先简述它和SVN的区别 SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活 ...
- mssql执行计划查看的一些知识
在MSSQL中,查看较慢语句的执行计划,就是一个比较直观的方式, 如果查看执行计划呢: 1.从右到左,从上到下的顺序阅读执行计划2.执行计划中每个图标代表一个运算符,总开销为100%3.数据从右向左在 ...
- Linux驱动调试-根据oops的栈信息,确定函数调用过程
上章链接入口: http://www.cnblogs.com/lifexy/p/8006748.html 在上章里,我们分析了oops的PC值在哪个函数出错的,那如何通过栈信息来查看出错函数的整个调用 ...
- ORACLE+PYTHON实战:复制A表数据到B表
最近在学习python ,看到了pythod的oracle,不仅可以一次fetch多条,也可以一次insert多条,想写一个复制A表数据到B表的程序来看看实际效率能不能提高.写完发现,非常惊艳!效率提 ...
- 使用Bitbucket Pipeline进行.Net Core项目的自动构建、测试和部署
1. 引言 首先,Bitbucket提供支持Mercurial和Git版本控制系统的网络托管服务.简单来说,它类似于GitHub,不同之处在于它支持个人免费创建私有项目仓库.除此之外,Bitbucke ...
- Retrofit网络请求库应用01
PS:什么是Retrofit? 在官方文档中有这样一句话--A type-safe HTTP client for Android and Java(一个类型安全的http client库),具体的话 ...
- UWP 共享文件——发送者
这一节,顾名思义,即使你要共享数据给别人,你是数据的提供者.分两步即可1.直接复制代码 protected override void OnNavigatedTo(NavigationEventArg ...