System.NullReferenceException Xamarin Android arrayAdapter - PullRequest
0 голосов
/ 19 февраля 2020

инициализировать ArrayAdapter по классу MainActivity, установить его в OnCreate и все еще в методе UpdateAdapter (устройство BluetoothDevice) Я получаю ошибку: System.NullReferenceException Object Reference not set to an instance of object

https://imgur.com/a/RFTK4NA

public class MainActivity : AppCompatActivity
    {
        ListView mainlist;
        List<string> lista = new List<string>();
        public ArrayAdapter<string> arrayAdapter; ...

        protected override void OnCreate(Bundle savedInstanceState)
        {
            mainlist = (ListView)FindViewById<ListView>(Resource.Id.listView1);
            arrayAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, lista);
            mainlist.Adapter = arrayAdapter;

...

        skanujbtn.Click += (sender, e) =>
        {
            var receiver_ = new BluetoothDeviceReceiver();
            IntentFilter filter = new IntentFilter(BluetoothDevice.ActionFound);
            RegisterReceiver(receiver_, filter);
            if (!bluetoothAdapter.IsDiscovering) bluetoothAdapter.StartDiscovery();}

        public void UpdateAdapter(BluetoothDevice device)
        {
            lista.Add(device.Name);
            arrayAdapter.NotifyDataSetChanged();
        }
    }

Другой класс

public class BluetoothDeviceReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        var action = intent.Action;
        if (action != BluetoothDevice.ActionFound)
        {
            return;
        }
    // Get the device
    var device = (BluetoothDevice)intent.GetParcelableExtra(BluetoothDevice.ExtraDevice);

    if (device.BondState != Bond.Bonded)
    {
        MainActivity obj = new MainActivity();
        obj.UpdateAdapter(device);

    }
}

1 Ответ

0 голосов
/ 19 февраля 2020

В коде это мало что говорит, вы должны поделиться, где вы используете этот метод?

Вот мои догадки:

Guess1:

Вопрос: На что инициализируется объект устройства?

Возможно, объект устройства вы получаете в методе null из того, что я вижу: если у вас есть класс что-то вроде этого

public class BluetoothDevice
{
    public string Name { get; set; }
}

Вам нужно инициализировать его как минимум для одного объекта, прежде чем он будет передан в метод

 BluetoothDevice device = new BluetoothDevice()
 {
      Name = "SomeBluetoothDevice"
 };

Guess2:

Вы вызываете метод UpdateAdapter () до инициализации адаптера

РЕДАКТИРОВАТЬ:

Вот проблема, которую вы создаете новый экземпляр из MainActivity

if (device.BondState != Bond.Bonded)
    {
        **MainActivity obj = new MainActivity();**
        obj.UpdateAdapter(device);

    }

таким образом, он создаст новый экземпляр действия, но не будет вызывать метод OnCreate, потому что это не так, как действия создаются, вы можете создать с намерением типа

В любом случае, вот как вы можете исправить проблему: используйте уже существующий экземпляр из Activity в BluetoothDeviceReceiver, добавьте этот код:

public class BluetoothDeviceReceiver : BroadcastReceiver
    {
        MainActivity mainActivity;
        public BluetoothDeviceReceiver(MainActivity mainActivity)
        {
            this.mainActivity = mainActivity;
        }

        public override void OnReceive(Context context, Intent intent)
        {
            mainActivity.UpdateAdapter(device);
        }
    }

В основной деятельности Vity:

 skanujbtn.Click += (sender, e) =>
 {
            var receiver_ = new BluetoothDeviceReceiver(this);
...
 }
...