2016-06-06 15 views
8

Sto costruendo un'applicazione che consente all'utente di connettersi alla propria rete wifi locale senza uscire. Tuttavia, ogni volta che seleziono un elemento nell'elenco, viene visualizzato l'ID di rete errato e si connette alla rete sbagliata. Ho notato che:Adattatore per array Android Selezione dell'ID errato

  • Se ho tre reti disponibili e seleziono quella in alto, appare quella in basso a cui connettersi.
  • È anche vero il contrario
  • Quando seleziono quello centrale in realtà funziona.

Ecco il mio codice qui sotto:

//from `onCreate` method 
Button buttonScan = (Button) findViewById(R.id.buttonScan); 
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
ListView lv = (ListView) findViewById(R.id.list); 
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     connectToWifi(arg2); 
    } 
}); 
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
    @Override 
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     return true; 
    } 
}); 

if (!wifi.isWifiEnabled()) { 
    Toast.makeText(getApplicationContext(), "Enabling Wifi", Toast.LENGTH_LONG).show(); 
    wifi.setWifiEnabled(true); 
} 

SimpleAdapter adapter = 
     new SimpleAdapter(
       NetworkCalibration.this, 
       arraylist, 
       R.layout.wifi_list_row, 
       new String[] { ITEM_KEY }, 
       new int[] { R.id.listValue }); 
lv.setAdapter(adapter); 

registerReceiver(new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context c, Intent intent) { 
     results = wifi.getScanResults(); 
     size = results.size(); 
    } 
}, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 

Selecter(hNum, vNum); 

buttonScan.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     noob = false; 
     SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putBoolean("Newbie", noob); 
     editor.commit(); 
     arraylist.clear(); 
     wifi.startScan(); 

     Toast.makeText(getApplicationContext(), "Scanning...", Toast.LENGTH_SHORT).show(); 
     try { 
      size = size - 1; 
      while (size >= 0) { 
       HashMap<String, String> item = new HashMap<String, String>(); 
       item.put(ITEM_KEY, 
         results.get(size).SSID.toString() 
           + results.get(size).capabilities.toString()); 

       arraylist.add(item); 
       size--; 
       adapter.notifyDataSetChanged(); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

public void finallyConnect(String checkPassword, int position) { 
    String networkSSID = results.get(position).SSID; 
    WifiConfiguration wifiConfiguration = new WifiConfiguration(); 
    wifiConfiguration.SSID = "\""+ networkSSID +"\""; 
    wifiConfiguration.preSharedKey ="\""+ checkPassword +"\""; 
    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 
    int netId = wifiManager.addNetwork(wifiConfiguration); 

    if (!wifiManager.isWifiEnabled()) { //---wifi is turned on--- 
     //---disconnect it first--- 
     wifiManager.setWifiEnabled(true); 
    } 
    wifiManager.enableNetwork(netId, true); 
    wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL, networkSSID); 
    wifiManager.reconnect(); 
    wifiManager.saveConfiguration(); 

    /* WifiConfiguration wifiConfig = new WifiConfiguration(); 
    wifiConfig.SSID = String.format("\"%s\"", networkSSID); 
    wifiConfig.preSharedKey = String.format("\"%s\"", networkPass); 

    // remember id 
    int netId = wifi.addNetwork(wifiConfig); 
    wifi.disconnect(); 
    wifi.enableNetwork(netId, true); 
    wifi.reconnect(); 

    WifiConfiguration conf = new WifiConfiguration(); 
    conf.SSID = "\"\"" + networkSSID + "\"\""; 
    conf.preSharedKey = "\"" + networkPass + "\""; 
    wifi.addNetwork(conf);*/ 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putBoolean("Connected",isConnected); 
    editor.commit(); 
} 

private void connectToWifi(final int position) { 
    final Dialog dialog = new Dialog(context); 
    dialog.setContentView(R.layout.wifi_connect); 
    dialog.setTitle("Connect to Network"); 
    TextView textSSID = (TextView) dialog.findViewById(R.id.textSSID1); 
    TextView textBSSID = (TextView) dialog.findViewById(R.id.textBSSID1); 
    TextView capabilities = (TextView) dialog.findViewById(R.id.textCapabilities); 
    Button dialogButton = (Button) dialog.findViewById(R.id.okButton); 
    pass = (EditText) dialog.findViewById(R.id.textPassword); 
    pass.requestFocus(); 
    InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputMethodManager.showSoftInput(pass, InputMethodManager.SHOW_IMPLICIT); 
    textSSID.setText(results.get(position).SSID); 
    textBSSID.setText(results.get(position).BSSID); 
    capabilities.setText(results.get(position).capabilities); 
    // if button is clicked, connect to the network; 
    dialogButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      checkPassword = pass.getText().toString(); 
      finallyConnect(checkPassword, position); 
      statusText.setText("Connecting..."); 
      statusText.setTextColor(Color.parseColor("#000000")); 
      CheckConnection(); 
      dialog.dismiss(); 
     } 
    }); 
    dialog.show(); 
} 

Qualsiasi idea del perché questo sarebbe successo? Grazie a tutti!

+0

scusa, non per la tua domanda, ma non capisco appieno cosa sta facendo la tua app. connettendo una rete senza lasciare cosa? –

+1

@ ÖzgürBağcı Senza uscire dall'applicazione. Può connettersi a Internet internamente. – Ethan

risposta

5

Ho risolto questo problema invertendo pochi segni nel mio codice e ridefinendo alcune variabili. Codice di funzionamento finale di seguito:

try { 
size = 0; 
while (size >= 0) { 
HashMap<String, String> item = new HashMap<String, String>(); 
item.put(
    ITEM_KEY, 
    results.get(size).SSID.toString() + results.get(size).capabilities.toString() 
); 

arraylist.add(item); 
size++; 
adapter.notifyDataSetChanged(); 

} catch (Exception e) { 
} 

E wha'la!

1

Quando si aggiungono gli elementi all'adattatore, si sta procedendo in modo inverso. Cioè, stai prendendo l'ultimo oggetto da results e lo memorizzi al primo posto di arraylist. Vi suggerisco semplicemente Inverse l'anello di corrente dal cambiamento di questo codice:

try { 
    size = size - 1; 
    while (size >= 0) { 
    HashMap<String, String> item = new HashMap<String, String>(); 
    item.put(
     ITEM_KEY, 
     results.get(size).SSID.toString() + results.get(size).capabilities.toString() 
    ); 

    arraylist.add(item); 
    size--; 
    adapter.notifyDataSetChanged(); 

} catch (Exception e) { 
} 

per questo uno:

try { 
    for (int i = 0; i < size; i++) { 
     HashMap<String, String> item = new HashMap<String, String>(); 
     item.put(
      ITEM_KEY, 
      results.get(size).SSID.toString() + results.get(size).capabilities.toString() 
     ); 

     arraylist.add(item); 
     adapter.notifyDataSetChanged(); 
    } 

} catch (Exception e) { 
} 
+0

Ho aggiunto 'wifi.startScan' all'inizio del blocco try ma non appare nulla che abbia chiamato' arraylist' – Ethan

+0

Hai provato ** invertendo il loop ** come suggerito? – josemigallas

+0

Sì, ho sostituito il mio blocco di codice con il tuo suggerimento dall'alto, nessuna delle reti circostanti visualizzate nell'adattatore di array – Ethan