java - 无显示 - 使用 SimpleAdapter 的 ListView

标签 java android android-layout listview adapter

我正在尝试显示范围内所有 wifi AP 的列表,即包括具有相同 SSID 的 AP,因为默认 wifi 设置中未显示这些 AP。

这是我第一次尝试 Android SDK,到目前为止我已经得到了:

package com.iiitd.wifistats;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WiFiStats extends Activity implements View.OnClickListener {

    WifiManager wifi;
    List<ScanResult> scanResults;
    ArrayList<Map<String, Integer>> list;
    SimpleAdapter adapter;
    ListView listview;

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

        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        if (!wifi.isWifiEnabled()) {
            Toast.makeText(getApplicationContext(), "Turning on WiFi...", Toast.LENGTH_LONG).show();
            wifi.setWifiEnabled(true);
        }

        carryON();
    }

    private void carryON(){
        final Button button = (Button) findViewById(R.id.buttonScan);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                wifi = (WifiManager) v.getContext().getSystemService(Context.WIFI_SERVICE);
                scanResults = wifi.getScanResults();
                Toast.makeText(getApplicationContext(), "Scanning...", Toast.LENGTH_SHORT).show();
                list = buildData(scanResults);
                //Toast.makeText(getApplicationContext(), list.toString(), Toast.LENGTH_SHORT).show();
                adapter = new SimpleAdapter(v.getContext(), list, R.layout.listitem, new String[]{"BSSID", "strength"}, new int[] {R.id.BSSID, R.id.strength});
                //Toast.makeText(getApplicationContext(), adapter.toString(), Toast.LENGTH_SHORT).show();
                listview = (ListView) findViewById(R.id.list);
                listview.setAdapter(adapter);
            }
        });
    }

    private ArrayList<Map<String, Integer>> buildData(java.util.List<ScanResult> s) {
        ArrayList<Map<String, Integer>> list = new ArrayList<Map<String, Integer>>();
        for (ScanResult result : s) {
            list.add(putData(result.BSSID, result.level));
        }
        return list;
    }

    private HashMap<String, Integer> putData(String BSSID, int level) {
        HashMap<String, Integer> item = new HashMap<String, Integer>();
        item.put(BSSID, level);
        return item;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.wi_fi_stats, menu);
        return true;
    }

    @Override
    public void onClick(View view) {

    }
}

这是我的activity_xml:

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        xmlns:android="http://schemas.android.com/apk/res/android">

    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Scan"
            android:id="@+id/buttonScan"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"/>

    <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/list"
            android:layout_above="@+id/buttonScan"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="14dp"/>
</RelativeLayout>

这是 listitem.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="?android:attr/listPreferredItemHeight"
                android:padding="6dip">

    <TextView
            android:id="@+id/strength"
            android:layout_width="fill_parent"
            android:layout_height="26dip"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:ellipsize="marquee"
            android:singleLine="true"
            android:text="Description"
            android:textSize="12sp"/>
    <TextView
            android:id="@+id/BSSID"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_above="@id/strength"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_alignWithParentIfMissing="true"
            android:gravity="center_vertical"
            android:text="Example application"
            android:textSize="16sp"/>

</RelativeLayout>

我开始扫描时没有显示列表。但是,如果我使用 toast ,我可以看到列表正在正确形成。有人可以在这里指导我吗?谢谢。

最佳答案

看看这里的代码

adapter = new SimpleAdapter(v.getContext(), list, R.layout.listitem, new String[]{"BSSID", "strength"}, new int[] {R.id.BSSID, R.id.strength});

字符串数组告诉适配器在访问您定义的映射时要使用的键。在您的代码中,您将这样分配值

private HashMap<String, Integer> putData(String BSSID, int level) {
    HashMap<String, Integer> item = new HashMap<String, Integer>();
    item.put(BSSID, level);
    return item;
}

这是将 level 的 int 分配给字符串 BSSID 设置的键。您需要更改代码中所有出现的 HashMap 以获取 String 值和 String 键 HashMap< String, String >并将该方法替换为以下内容

private HashMap<String, String> putData(String BSSID, int level) {
    HashMap<String, String> item = new HashMap<String, String>();
    item.put("BSSID", BSSID);
    item.put("strength", Integer.toString(level));
    return item;
}

关于java - 无显示 - 使用 SimpleAdapter 的 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18602771/

相关文章:

android - 布局元素 : one on top of the other

android - 如何设置布局 :width of an object to (wrap_content + 10)?

Android 如何在没有 onDown true 的情况下在 LinearLayout 上添加滑动手势

java - 将 ArrayList 的引用传递给方法

java - 打印不同的数组元素

android - 获取具有特定空 RealmList 属性的所有对象

Android 创建位图 + crop 导致 OutOfMemory 错误(最终)

android - Android 手机上的采样率

java - 使用 Thread.sleep 来减慢脚本的缺点?

java - 什么是正则表达式 "independent non-capturing group"?