网上的源代码通常都是JAVA实现的,以下是用C#实现的
新建两个类
using Android.App;
using Android.Content;
using Android.Content.Res;
using Android.OS;
using Android.Runtime;
using Android.Support.V7.Widget;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
public class ImageAndText
{
private int iItemImageId;
private String strItemText;
public ImageAndText(int ImageId, String ItemText) //构造器
{
this.iItemImageId = ImageId;
this.strItemText = ItemText;
}
public String GetItmeText()
{
return strItemText;
}
public int GetImageId()
{
return iItemImageId;
}
public void SetImageId(int iNewImageId)
{
iItemImageId = iNewImageId;
}
}
public class ImageAndTextAdapter : RecyclerView.Adapter
{
private List<ImageAndText> m_ItemList; //存放 图像加文本类 的链表
public event EventHandler<int> ItemClick; //事件驱动
public ImageAndTextAdapter(List<ImageAndText> itemList) //构造器
{
m_ItemList = itemList;
}
public override int ItemCount //返回列表中项个数
{
get { return m_ItemList.Count; }
}
void OnClick(int position)
{
if (ItemClick != null)
ItemClick(this, position);
}
public void SetItemImage(int iPos,int iNewImageId)
{
m_ItemList[iPos].SetImageId(iNewImageId);
}
public int GetItemImage(int iPos)
{
return m_ItemList[iPos].GetImageId();
}
public string GetItemText(int iPos)
{
return m_ItemList[iPos].GetItmeText();
}
//一个Item的数据绑定事件
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) //adapter = new ImageAndTextAdapter(m_ItemList)时调用多次
{
ImageAndText item = m_ItemList[position]; //假设是0
ItemViewHolder itemHolder = holder as ItemViewHolder; //包含itemimage itemtext
itemHolder.itemImage.SetImageResource(item.GetImageId());
itemHolder.itemText.Text = item.GetItmeText();
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) //adapter = new ImageAndTextAdapter(m_ItemList)时调用多次
{
View view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.ImageTextLayout, parent, false);
ItemViewHolder holder = new ItemViewHolder(view,OnClick);
return holder;
}
public override void OnViewRecycled(Java.Lang.Object holder)
{
base.OnViewRecycled(holder);
ItemViewHolder ItemHolder = holder as ItemViewHolder;
}
protected class ItemViewHolder : RecyclerView.ViewHolder
{
public ImageView itemImage;
public TextView itemText;
public ItemViewHolder(View itemview, Action<int> listener) : base(itemview)
{
itemImage = itemview.FindViewById(Resource.Id.IamgeViewImage) as ImageView;
itemText = itemview.FindViewById(Resource.Id.TextViewText) as TextView;
itemview.Click += (sender, e) => listener(base.LayoutPosition); //单击某个项时被调用 然后去了void OnClick(int position)
}
}
}
两个活动
AutoWindow.cs
using Android.App;
using Android.Content;
using Android.Content.Res;
using Android.OS;
using Android.Runtime;
using Android.Support.V7.Widget;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace JCFlat
{
[Activity(Label = "自动窗")]
public class AutoWindow : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.AutoWindow);
}
}
}
InCludeAutoWindow.cs
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.Support.V7.App;
using Android.Support.V7.Widget;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace JCFlat
{
[Activity(Label = "自动窗")]
public class InCludeAutoWindow : AppCompatActivity
{
private List<ImageAndText> m_ItemList = new List<ImageAndText>();
ImageAndTextAdapter adapter;
Button btnRefreshAutoWindow;
Socket socket;
Button btnAllOpenAutoWindow;
Button btnAllCloseAutoWindow;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.InCludeAutoWindow);
// Create your application here
InitAutoWindow(); //初始化数据
RecyclerView recyclerView = FindViewById<RecyclerView>(Resource.Id.recyclerViewAutoWindow);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
adapter = new ImageAndTextAdapter(m_ItemList);
recyclerView.SetLayoutManager(layoutManager);
recyclerView.SetAdapter(adapter);
adapter.ItemClick += OnItemClick;
btnRefreshAutoWindow = FindViewById<Button>(Resource.Id.buttonRefreshAutoWindow);
btnRefreshAutoWindow.Click += BtnRefreshAutoWindow_Click;
btnAllOpenAutoWindow = FindViewById<Button>(Resource.Id.buttonAllOpenAutoWindow);
btnAllOpenAutoWindow.Click += BtnAllOpenAutoWindow_Click;
btnAllCloseAutoWindow = FindViewById<Button>(Resource.Id.buttonAllCloseAutoWindow);
btnAllCloseAutoWindow.Click += BtnAllCloseAutoWindow_Click;
}
private void BtnAllCloseAutoWindow_Click(object sender, EventArgs e) //循环关闭全部自动窗
{
ISharedPreferences preMy = GetSharedPreferences("Settings", 0); //获取内部存储
string strcurrStore = preMy.GetString("currStore", "");
string[] LocalStoreArgs;
LocalStoreArgs = strcurrStore.Split("|");
string strStoreIp = LocalStoreArgs[5]; //仓房平板ip
int iStorePort = int.Parse(LocalStoreArgs[6]); //仓房平板监听端口号
for (int i = 0; i < adapter.ItemCount; i++)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //准备连接到仓房监听的端口
IPAddress ip = IPAddress.Parse(strStoreIp);
IPEndPoint point = new IPEndPoint(ip, iStorePort);
socket.SendTimeout = 2000;
socket.Connect(point);
if (socket.Connected == false)
{
Toast.MakeText(this, "分机连接失败...", ToastLength.Short).Show();
return;
}
adapter.SetItemImage(i, Resource.Drawable.AutoWindowHalfOpen);
byte[] var = new byte[2];
var[0] = byte.Parse(adapter.GetItemText(i));
var[1] = 0;
string msg = JCToolSet.MakeSendCmdStr(0, 0XA5, var.Length, var); // 发送测温命令诸如"55AA55AA00B00001000B7316E916E9
byte[] buffer = new byte[1024 * 1024 * 3];
buffer = Encoding.UTF8.GetBytes(msg);
socket.Send(buffer);
//这里循环等待0.3秒
Thread.Sleep(300);
socket.Close();
}
adapter.NotifyDataSetChanged();
}
private void BtnAllOpenAutoWindow_Click(object sender, EventArgs e) //循环打开全部自动窗
{
ISharedPreferences preMy = GetSharedPreferences("Settings", 0); //获取内部存储
string strcurrStore = preMy.GetString("currStore", "");
string[] LocalStoreArgs;
LocalStoreArgs = strcurrStore.Split("|");
string strStoreIp = LocalStoreArgs[5]; //仓房平板ip
int iStorePort = int.Parse(LocalStoreArgs[6]); //仓房平板监听端口号
for (int i=0; i < adapter.ItemCount; i++)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //准备连接到仓房监听的端口
IPAddress ip = IPAddress.Parse(strStoreIp);
IPEndPoint point = new IPEndPoint(ip, iStorePort);
socket.SendTimeout = 2000;
socket.Connect(point);
if (socket.Connected == false)
{
Toast.MakeText(this, "分机连接失败...", ToastLength.Short).Show();
return;
}
adapter.SetItemImage(i, Resource.Drawable.AutoWindowHalfOpen);
byte[] var = new byte[2];
var[0] = byte.Parse(adapter.GetItemText(i));
var[1] = 90;
string msg = JCToolSet.MakeSendCmdStr(0, 0XA5, var.Length, var); // 发送测温命令诸如"55AA55AA00B00001000B7316E916E9
byte[] buffer = new byte[1024 * 1024 * 3];
buffer = Encoding.UTF8.GetBytes(msg);
socket.Send(buffer);
//这里循环等待0.3秒
Thread.Sleep(300);
socket.Close();
}
adapter.NotifyDataSetChanged();
}
private void BtnRefreshAutoWindow_Click(object sender, EventArgs e) //读取全部自动窗状态 通过socket发送命令与接收数据,根据返回的结果 刷新填充的好的自动窗的状态
{
//将所有自动窗的状态读取回来,然后真正赋值图像
ISharedPreferences preMy = GetSharedPreferences("Settings", 0); //获取内部存储
string strcurrStore = preMy.GetString("currStore", "");
string[] LocalStoreArgs;
LocalStoreArgs = strcurrStore.Split("|");
string strStoreIp = LocalStoreArgs[5]; //仓房平板ip
int iStorePort = int.Parse(LocalStoreArgs[6]); //仓房平板监听端口号
for (int i = 0; i < adapter.ItemCount; i++)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //准备连接到仓房监听的端口
IPAddress ip = IPAddress.Parse(strStoreIp);
IPEndPoint point = new IPEndPoint(ip, iStorePort);
socket.SendTimeout = 2000;
socket.Connect(point);
if (socket.Connected == false)
{
Toast.MakeText(this, "分机连接失败...", ToastLength.Short).Show();
return;
}
else
{
byte[] var = new byte[1];
var[0] =byte.Parse(adapter.GetItemText(i));
string msg = JCToolSet.MakeSendCmdStr(0, 0XA6, var.Length, var); // 发送测温命令诸如"55AA55AA00B00001000B7316E916E9
byte[] buffer = new byte[1024 * 1024 * 3];
buffer = Encoding.UTF8.GetBytes(msg);
socket.Send(buffer);
//这里循环等待0.3秒,直到数据返回
Thread.Sleep(300);
byte[] bufferRec = new byte[1024 * 1024 * 3];
int len = socket.Receive(bufferRec); //实际接收到的有效字节数
string str = Encoding.UTF8.GetString(bufferRec, 0, len);
socket.Close();
string[] arrAutoWindow = new string[2];
JCToolSet.AnaAutoWindowData(str, arrAutoWindow); //分析返回的数据
if (arrAutoWindow[0] == "-1")
{
adapter.SetItemImage(i, Resource.Drawable.AutoWindowError);
}
else if (arrAutoWindow[0] == "45")
{
adapter.SetItemImage(i, Resource.Drawable.AutoWindowHalfOpen );
}
else if (arrAutoWindow[0] == "0")
{
adapter.SetItemImage(i, Resource.Drawable.AutoWindowClose);
}
else if (arrAutoWindow[0] == "90")
{
adapter.SetItemImage(i, Resource.Drawable.AutoWindowOpen);
}
}
}
adapter.NotifyDataSetChanged(); //统一通知改变
}
void OnItemClick(object sender, int position) //单击列表中的某一项时调用
{
Toast.MakeText(this, adapter.GetItemText(position) , ToastLength.Short).Show();
//Toast.MakeText(this, "This is photo number " + position, ToastLength.Short).Show();
int iItemIamgeID = adapter.GetItemImage(position);
if (iItemIamgeID == Resource.Drawable.AutoWindowError) //如果图像为错误或者半开或者未确认状态 则返回
{
return;
}
if (iItemIamgeID == Resource.Drawable.AutoWindowHalfOpen)
{
return;
}
if (iItemIamgeID == Resource.Drawable.AutoWindowNone)
{
return;
}
ISharedPreferences preMy = GetSharedPreferences("Settings", 0); //获取内部存储
string strcurrStore = preMy.GetString("currStore", "");
string[] LocalStoreArgs;
LocalStoreArgs = strcurrStore.Split("|");
string strStoreIp = LocalStoreArgs[5]; //仓房平板ip
int iStorePort = int.Parse(LocalStoreArgs[6]); //仓房平板监听端口号
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //准备连接到仓房监听的端口
IPAddress ip = IPAddress.Parse(strStoreIp);
IPEndPoint point = new IPEndPoint(ip, iStorePort);
socket.SendTimeout = 2000;
socket.Connect(point);
if (socket.Connected == false)
{
Toast.MakeText(this, "分机连接失败...", ToastLength.Short).Show();
return;
}
if (iItemIamgeID == Resource.Drawable.AutoWindowClose) //如果状态为关 则发送开命令
{
adapter.SetItemImage(position, Resource.Drawable.AutoWindowHalfOpen );
byte[] var = new byte[2];
var[0] = byte.Parse(adapter.GetItemText(position));
var[1] = 90;
string msg = JCToolSet.MakeSendCmdStr(0, 0XA5, var.Length, var); // 发送测温命令诸如"55AA55AA00B00001000B7316E916E9
byte[] buffer = new byte[1024 * 1024 * 3];
buffer = Encoding.UTF8.GetBytes(msg);
socket.Send(buffer);
//这里循环等待0.3秒
Thread.Sleep(300);
socket.Close();
}
else if (iItemIamgeID == Resource.Drawable.AutoWindowOpen) //如果状态为开 则发送关命令
{
adapter.SetItemImage(position, Resource.Drawable.AutoWindowHalfOpen);
byte[] var = new byte[2];
var[0] = byte.Parse(adapter.GetItemText(position));
var[1] = 0;
string msg = JCToolSet.MakeSendCmdStr(0, 0XA5, var.Length, var); // 发送测温命令诸如"55AA55AA00B00001000B7316E916E9
byte[] buffer = new byte[1024 * 1024 * 3];
buffer = Encoding.UTF8.GetBytes(msg);
socket.Send(buffer);
//这里循环等待0.3秒
Thread.Sleep(300);
socket.Close();
}
adapter.NotifyItemChanged(position); //通知单个项发送改变
}
private void InitAutoWindow()
{
ImageAndText book = null;
ISharedPreferences preCurr = GetSharedPreferences("Settings", 0); //从内部存储中取出当前仓房参数详情
string strcurrStore = preCurr.GetString("currStore", "");
string[] strLineContent;
strLineContent = strcurrStore.Split("|"); //每行内容用|隔开,将隔开的数据送入数组
string[] strAutoWindows;
strAutoWindows = strLineContent[7].Split(" "); //自动窗的号码在数组7 格式为1 2 3 4
foreach (string strTemp in strAutoWindows) //提取自动窗号码,配上图像增加到窗口上
{
book = new ImageAndText(Resource.Drawable.AutoWindowNone, strTemp);
m_ItemList.Add(book);
}
}
}
}
两个布局
InCludeAutoWindow.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/autowindow" />
</android.support.design.widget.CoordinatorLayout>
AutoWindow.xml //使用了 ScrollView TableLayout TableRow RecyclerView
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:id="@+id/SV"
android:orientation="vertical"
android:background="@drawable/side_nav_bar"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
>
<TableLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/side_nav_bar"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recyclerViewAutoWindow" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:text="刷新"
android:layout_width="118.5dp"
android:layout_height="62.0dp"
android:id="@+id/buttonRefreshAutoWindow"
/>
<Button
android:text="全开"
android:layout_width="118.5dp"
android:layout_height="62.0dp"
android:id="@+id/buttonAllOpenAutoWindow"
/>
<Button
android:text="全关"
android:layout_width="118.5dp"
android:layout_height="62.0dp"
android:id="@+id/buttonAllCloseAutoWindow"
/>
</TableRow>
</TableLayout>
</ScrollView>
默认初始状态
刷新后状态
全开 全关 单击打开的窗 单击关闭的窗的图像忽略,哈哈