[Verständnisproblem] Bluetooth LE Geräte scannen - Scan klappt, Anzeige nicht

S

samhain

Neues Mitglied
0
Hallo zusammen,

ich möchte mit einer App nach BluetoothLe-Geräten scannen und anschließend deren Adressen in einer Liste anzeigen.
Dabei habe ich mich vor allem an dieses Beispiel -> Android Custom ListView with Images and Text - Example gehalten und mir noch etwas von der Android Developer Page abgeschaut -> https://developer.android.com/sampl...droid.bluetoothlegatt/DeviceScanActivity.html

Mittlerweile habe ich zwar das Problem gelöst, indem ich mich hauptsächlich an dem zweiten Beispiel orientiert habe und der Scan und die Anzeige funktionieren aber ich wüsste gerne wo der Fehler in meinem ersten Versuch liegt.
Hier habe ich nämlich das Problem, dass die Bluetooth-Geräte zwar gefunden und der ArrayList "bcnList" hinzugefügt werden aber die ListView nichts anzeigt. Mir ist klar, dass aufgrund des Threads die Liste schon angezeigt wird während der Scanvorgang noch läuft aber ich dachte mit "notifyDataSetChanged()" würde die darzustellende Liste "refreshed". Vielleicht kann mir jemand meinen Fehler erklären.
Nun hier erstmal mein Code:

MainActivity
Code:
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import java.util.ArrayList;


public class MainActivity extends Activity {

    private ListView list;
    private Handler mHandler;
    private boolean mScanning;
    private BluetoothAdapter mBluetoothAdapter;
    private LeDeviceAdapter mLeDeviceListAdapter;
    private ArrayList<String> bcnList;

    private BluetoothAdapter.LeScanCallback mLeScanCallback =
            new BluetoothAdapter.LeScanCallback() {

                @Override
                public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (!bcnList.contains(device.getAddress())){
                                bcnList.add(device.getAddress());
                                mLeDeviceListAdapter.notifyDataSetChanged();
                            }
                        }
                    });
                }
            };

    private static final int SCAN_PERIOD = 5000;
    private static final int REQUEST_ENABLE_BT = 1;

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

        bcnList = new ArrayList<String>();
        mHandler = new Handler();
        final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        switch (id){
            case R.id.scan:
                mLeDeviceListAdapter = new LeDeviceAdapter(this, bcnList);
                scanLeDevice(true);
                fillList();
                return true;
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);

        }
    }

    private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                    invalidateOptionsMenu();
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        invalidateOptionsMenu();
    }

    private boolean fillList(){
        list = (ListView) findViewById(R.id.list);
        list.setAdapter(mLeDeviceListAdapter);
        return true;
    }
}
LeDeviceAdapter
Code:
import android.app.Activity;
import android.content.Context;
import android.text.Layout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by miho on 08.09.14.
 */
public class LeDeviceAdapter extends ArrayAdapter<String> {

    private ArrayList<String> bcnList;
    private Activity context;

    public LeDeviceAdapter(Activity context, ArrayList<String> addresses) {
        super(context, R.layout.list_single);
        this.context = context;
        bcnList = addresses;
    }


    @Override
    public View getView(int position, View view, ViewGroup parent){
        LayoutInflater inflater = context.getLayoutInflater();
        View row = inflater.inflate(R.layout.list_single, null, true);
        TextView address = (TextView) row.findViewById(R.id.txt);
        address.setText(bcnList.get(position));
        return row;
    }
}
 
Refresht du deine UI nach dem Handler?
 
Hab meinen Fehler gefunden. Das Problem war, dass ich 'getCount()' nicht überschrieben habe und NULL zurückgeliefert wurde. Aus diesem Grund wurde auch 'getView()' nicht aufgerufen. Dass man 'getCount()' für 'getView()' benötigt wusste ich nicht bzw. dachte ich die Implementierung von ArrayAdapter wäre ausreichend. Wiedermal was gelernt :biggrin:
 

Ähnliche Themen

D
  • Data2006
3 4 5
Antworten
84
Aufrufe
3.706
jogimuc
J
S
Antworten
4
Aufrufe
4.468
mblaster4711
mblaster4711
SaniMatthias
Antworten
19
Aufrufe
960
swa00
swa00
Zurück
Oben Unten