2016-11-03 6 views
0

Ich habe ein Problem mit OnItemClickListener. Zum Beispiel habe ich in der Liste 4 Bluetooth-Geräte haben, ich auf ein Element klicken und die Anwendung versuchen, nur mit dem letzten Element der Liste nicht mit dem Element, das iListview und OnItemClickListener (Bluetooth-Gerät)

import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import java.lang.reflect.Method; 
import java.util.ArrayList; 


public class bluetooth extends AppCompatActivity { 
    private ListView listView; 
    private ArrayList<String> mDeviceList = new ArrayList<String>(); 
    private BluetoothAdapter mBluetoothAdapter; 
    private final static int REQUEST_ENABLE_BT=1; 

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

     listView = (ListView) findViewById(R.id.listView); 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     mBluetoothAdapter.startDiscovery(); 
     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
     registerReceiver(mReceiver, filter); 
     if(!mBluetoothAdapter.isEnabled()) 
     { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
      mBluetoothAdapter.startDiscovery(); 
      registerReceiver(mReceiver, filter); 
     } 

    } 

    @Override 
    protected void onDestroy() { 
     unregisterReceiver(mReceiver); 
     super.onDestroy(); 
    } 
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, final Intent intent) { 
      final BluetoothDevice device = intent 
       .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      String action = intent.getAction(); 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       mDeviceList.add(bluetoothDevice.getName() + "\n" 
        + bluetoothDevice.getAddress()); 
       listView.setAdapter(new ArrayAdapter<String>(context, 
        android.R.layout.simple_list_item_1, mDeviceList)); 
      } 
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapter, View view, int pos, long id){ 
        String devicep=listView.getAdapter().getItem(pos).toString(); 
        Log.i("device",devicep); 
        pairDevice(device); 
       } 
      }); 
     } 
    }; 

    private void pairDevice(BluetoothDevice b1) { 
     try { 
      Method method = b1.getClass().getMethod("createBond", (Class[]) null); 
      method.invoke(b1, (Object[]) null); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Antwort

1

Dies liegt wahrscheinlich daran, dass Sie das zuletzt entdeckte Gerät in der Variablen 'device' gespeichert haben und in Ihrem on ListView onItemClick pairDevice (device) aufrufen, unabhängig von der Position des angeklickten Elements.

Möglicherweise möchten Sie alle gesendeten gefundenen Geräte in einer Liste speichern und die entsprechenden Geräteobjekt aus der Liste erhalten nach dem Punkt angeklickt, so etwas wie dieses:

private ArrayList<BluetoothDevice> mDevices = new ArrayList<BluetoothDevice>(); 

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, final Intent intent) { 
     final BluetoothDevice device = intent 
      .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
     String action = intent.getAction(); 
     if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
      BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      // Add the recently discovered device in a list 
      mDevices.add(bluetoothDevice); 
      mDeviceList.add(bluetoothDevice.getName() + "\n" 
       + bluetoothDevice.getAddress()); 
      listView.setAdapter(new ArrayAdapter<String>(context, 
       android.R.layout.simple_list_item_1, mDeviceList)); 
     } 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapter, View view, int pos, long id){ 
       String devicep=listView.getAdapter().getItem(pos).toString(); 
       Log.i("device",device); 
       // Get the BluetoothDevice corresponding to the clicked item 
       pairDevice(mDevices.get(position)); 
      } 
     }); 
    } 
}; 
0

In Ihrem onItemClick Sie geklickt haben, zu paaren machen nichts mit der Liste, auf die Sie geklickt haben. Sie müssen das Element aus der Liste abrufen und das Paar koppeln.

BluetoothDevice bluetoothDevice = (BluetoothDevice) listView.getAdapter().getItem(pos); 
       pairDevice(bluetoothDevice); 

Versuchen Sie das und sagen Sie mir, wenn es funktioniert.

+0

nein, es funktioniert nicht, die App stürzt ab, weil das Casting nicht erlaubt ist. – luc

+0

Ah Ich sehe es jetzt, ich dachte, deine Geräteliste wäre eine Liste von BluetoothDevices anstelle von Strings, ändere das zu BluetoothDevice und das Hinzufügen von Bluetoothdevices zur Liste sollte meinen Code funktionieren lassen. – Gabe

Verwandte Themen