学习记录:Visual Studio 2019中使用C#进行Android开发07 实现一个带图像与文本的列表

网上的源代码通常都是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>
 

默认初始状态

刷新后状态

全开 全关 单击打开的窗 单击关闭的窗的图像忽略,哈哈

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iamtsfw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值