【问题标题】:Android Array Adapter Selecting the wrong IDAndroid Array Adapter 选择了错误的 ID
【发布时间】:2016-10-05 12:10:12
【问题描述】:

我正在构建一个应用程序,允许用户在不离开的情况下连接到本地 wifi 网络。但是,每当我在列表中选择一个项目时,就会出现错误的网络 ID,并且它连接到错误的网络。我注意到:

  • 如果我有三个可用网络,并且我选择了顶部的一个,那么底部的一个似乎可以连接。
  • 反之亦然
  • 当我选择中间那个时,它确实有效。

下面是我的代码:

//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();
}

知道为什么会发生这种情况吗?谢谢大家!

【问题讨论】:

  • 抱歉,不是关于您的问题,但我不完全了解您的应用程序在做什么。连接网络而不离开什么?
  • @ÖzgürBağcı 无需离开应用程序。它可以在内部连接到互联网。

标签: java android arraylist


【解决方案1】:

当您将项目添加到适配器时,您正在以相反的方式进行迭代。也就是说,您将从results 中取出最后一项并将其存储在arraylist 的第一位。我建议您通过更改此代码来简单地反转当前循环:

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) {
}

对于这个:

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) {
}

【讨论】:

  • 我在 try 块的顶部添加了 wifi.startScan,但在他调用的 arraylist 中没有出现任何内容
  • 您是否尝试过按照我的建议反转循环
  • 是的,我用上面的建议替换了我的代码块,周围的网络都没有显示到阵列适配器中
【解决方案2】:

我通过反转代码中的一些符号并重新定义一些变量来解决此问题。下面的最终工作代码:

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) {
}

哇!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多