Как добавить данные непосредственно в ArrayAdapter?

#java #android #bluetooth #android-arrayadapter

#java #Android #bluetooth #android-arrayadapter

Вопрос:

Я пытаюсь использовать этот код от разработчиков Bluetooth — Android

 Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
    // Loop through paired devices
    for (BluetoothDevice device : pairedDevices) {
        // Add the name and address to an array adapter to show in a ListView
        mArrayAdapter.add(device.getName()   "n"   device.getAddress());
    }
}
  

Но я не могу добавить данные myArrayAdapter , потому что они помещены в private void onCreate() и метод add выдает ошибку, что такого адаптера нет.

Мне нужно добавить данные непосредственно в ArrayAdapter, потому что он должен обновлять listview в моей деятельности при обнаружении новых устройств.

Также я мог бы использовать myArrayAdapter.notifyDataSetChanged() , но, как я уже сказал, мой ArrayAdapter помещен в onCreate , поэтому он не может получить к нему доступ.

Итак, мой вопрос в том, как разместить ArrayAdapter вне onCreate без каких-либо ошибок?

Мой класс Java с кодом, если это необходимо:

 public class DeviceList extends AppCompatActivity {

    private final static int REQUEST_ENABLE_BT = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_device_list);

        BluetoothAdapter BTAdapter = BluetoothAdapter.getDefaultAdapter();
        if (BTAdapter != null) {
            if (!BTAdapter.isEnabled()) {
                Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBT, REQUEST_ENABLE_BT);
            }
            if (BTAdapter.isDiscovering()) {
                BTAdapter.cancelDiscovery();
            }
            BTAdapter.startDiscovery();
        }

        ArrayAdapter<String> myArrayAdapter;
        ListView listView = (ListView) findViewById(R.id.inputELM);
        myArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myEntries);
        listView.setAdapter(myArrayAdapter);

        // Register the BroadcastReceiver
        IntentFilter ifilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        this.registerReceiver(mReceiver, ifilter);
    }

    ArrayList<String> myEntries = new ArrayList<>();
    // Create a BroadcastReceiver for ACTION_FOUND
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // Get the BluetoothDevice object from the Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // Add the name and address to an array adapter to show in a ListView
                String devs = device.getName()   "n"   device.getAddress();
                myEntries.add(devs);

            }
        }
    };
}
  

Комментарии:

1. Что вы не понимаете в полях / переменных-членах?

Ответ №1:

Просто место находится снаружи onCreate

 public class DeviceList extends AppCompatActivity {

    private final static int REQUEST_ENABLE_BT = 1;

    // Declare here 
    private ArrayAdapter<String> myArrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_device_list);

        BluetoothAdapter BTAdapter = BluetoothAdapter.getDefaultAdapter();
        if (BTAdapter != null) {
            if (!BTAdapter.isEnabled()) {
                Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBT, REQUEST_ENABLE_BT);
            }
            if (BTAdapter.isDiscovering()) {
                BTAdapter.cancelDiscovery();
            }
            BTAdapter.startDiscovery();
        }

        ListView listView = (ListView) findViewById(R.id.inputELM);
        myArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myEntries);
        listView.setAdapter(myArrayAdapter);

        // Register the BroadcastReceiver
        IntentFilter ifilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        this.registerReceiver(mReceiver, ifilter);
    }

    ArrayList<String> myEntries = new ArrayList<>();
    // Create a BroadcastReceiver for ACTION_FOUND
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // Get the BluetoothDevice object from the Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // Add the name and address to an array adapter to show in a ListView
                String devs = device.getName()   "n"   device.getAddress();
                myEntries.add(devs);
            }
        }
    };
}
  

Ответ №2:

Просто напишите

ArrayAdapter myArrayAdapter;

с объявлением статической переменной, чтобы вы могли получить к ней доступ из всех методов. Затем вы можете получить к нему доступ из любого места.