lateinit var mClickListener: ClickListener
fun setOnItemClickListener(aClickListener: ClickListener) {
mClickListener = aClickListener
}
interface ClickListener {
fun onClick(pos: Int, aView: View)
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
override fun onClick(v: View) {
mClickListener.onClick(adapterPosition, v)
}
val tvTitle = itemView.findViewById<TextView>(R.id.tv_cat_title)
init {
itemView.setOnClickListener(this)
}
}
и в своей деятельности просто внедрите прослушиватель щелчков
adapter.setOnItemClickListener(object : Adapter.ClickListener {
override fun onClick(pos: Int, aView: View) {
}
})
Кажется, что я нашел решение. Можно использовать winpcap для введения пакетов к любому интерфейсу. И существует хорошая обертка для .NET: http://www.tamirgal.com/home/dev.aspx?Item=SharpPcap
(Я предпочел бы решение, которое требует, чтобы никакие дополнительные библиотеки не были установлены...),
ОБНОВЛЕНИЕ: Вот то, что я предстал перед отправкой пакета WOL во всех интерфейсах:
//You need SharpPcap for this to work
private void WakeFunction(string MAC_ADDRESS)
{
/* Retrieve the device list */
Tamir.IPLib.PcapDeviceList devices = Tamir.IPLib.SharpPcap.GetAllDevices();
/*If no device exists, print error */
if (devices.Count < 1)
{
Console.WriteLine("No device found on this machine");
return;
}
foreach (NetworkDevice device in devices)
{
//Open the device
device.PcapOpen();
//A magic packet is a broadcast frame containing anywhere within its payload: 6 bytes of ones
//(resulting in hexadecimal FF FF FF FF FF FF), followed by sixteen repetitions
byte[] bytes = new byte[120];
int counter = 0;
for (int y = 0; y < 6; y++)
bytes[counter++] = 0xFF;
//now repeat MAC 16 times
for (int y = 0; y < 16; y++)
{
int i = 0;
for (int z = 0; z < 6; z++)
{
bytes[counter++] =
byte.Parse(MAC_ADDRESS.Substring(i, 2),
NumberStyles.HexNumber);
i += 2;
}
}
byte[] etherheader = new byte[54];//If you say so...
var myPacket = new Tamir.IPLib.Packets.UDPPacket(EthernetFields_Fields.ETH_HEADER_LEN, etherheader);
//Ethernet
myPacket.DestinationHwAddress = "FFFFFFFFFFFFF";//it's buggy if you don't have lots of "F"s... (I don't really understand it...)
try { myPacket.SourceHwAddress = device.MacAddress; }
catch { myPacket.SourceHwAddress = "0ABCDEF"; }//whatever
myPacket.EthernetProtocol = EthernetProtocols_Fields.IP;
//IP
myPacket.DestinationAddress = "255.255.255.255";
try { myPacket.SourceAddress = device.IpAddress; }
catch { myPacket.SourceAddress = "0.0.0.0"; }
myPacket.IPProtocol = IPProtocols_Fields.UDP;
myPacket.TimeToLive = 50;
myPacket.Id = 100;
myPacket.Version = 4;
myPacket.IPTotalLength = bytes.Length - EthernetFields_Fields.ETH_HEADER_LEN; //Set the correct IP length
myPacket.IPHeaderLength = IPFields_Fields.IP_HEADER_LEN;
//UDP
myPacket.SourcePort = 9;
myPacket.DestinationPort = 9;
myPacket.UDPLength = UDPFields_Fields.UDP_HEADER_LEN;
myPacket.UDPData = bytes;
myPacket.ComputeIPChecksum();
myPacket.ComputeUDPChecksum();
try
{
//Send the packet out the network device
device.PcapSendPacket(myPacket);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
device.PcapClose();
}
}
.NET действует в качестве виртуальной машины (CLR), таким образом, это абстрагирует далеко большую часть базовой реальной машины. Например, это только обеспечивает интерфейсы для TCP и сетей UDP, которые намного выше в стопке сетевого протокола это, что Вы обсуждаете. Вы смогли находить сторонний компонент, который обеспечивает доступ к интерфейсу низшего уровня, но я не рассчитывал бы на него (я посмотрел в прошлом для.NET и Java).
Для доступа к тому низко в стопке сетевого протокола, вероятно, необходимо будет кодировать в C к соответствующим системным вызовам ОС. Можно найти это самым легким в Python, и можно уже найти эту функциональность реализованной в или сторонних библиотеках Python. Например, я предлагаю смотреть на Скрученные сетевые библиотеки. Это было одной из причин, что я переключился на Python для большой части моей работы.
С наилучшими пожеланиями.