2013-09-03 2 views
0

Я пытаюсь отобразить список ВСЕХ AP-адресов Wi-Fi в диапазоне, то есть в том числе с теми же SSID, что и они не указаны в настройках wifi по умолчанию.Нет отображения - ListView с использованием SimpleAdapter

Это моя первая попытка 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> 

Когда я начинаю сканирование, список не отображается. Однако, если я использую тост, я вижу, что список правильно формируется. Может ли кто-нибудь направить меня сюда? Благодарю.

ответ

1

Посмотрите на код здесь

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; 
} 

Это назначение ИНТ для уровня к ключу, установленному Струнный BSSID. Вы должны изменить все вхождения HashMap в вашем коде, чтобы принять значение и строку ключа 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; 
} 
+0

Okay. Я пробовал это и, похоже, работает! :) Однако значения не обновляются каждый раз, когда я нажимаю «Сканировать». Infact, только одна пара значений сохраняется в нескольких запусках приложений. Кажется, мне нужно очищать содержимое списка каждый раз, когда нажимается «Сканировать». Как я могу это сделать? – vinayakshukl

+0

После того, как вы изменили содержимое адаптера, вы можете вызвать adapter.notifyDataSetChanged(); и он должен предупредить адаптер о том, что представления необходимо обновить. – RWJames64

+0

Да, я пробовал это. listview = (ListView) findViewById (R.id.list); listview.setAdapter (адаптер); adapter.notifyDataSetChanged(); Не работает. – vinayakshukl

0

Вы пытались расширить ListActivity вместо простой активности? вам может понадобиться изменить идентификатор ListView в вашем XML для андроида: ID = «@ ID/андроид: список»

Тогда в вашем методе caryON() вы бы назвали setListAdapter(adapter); после инициализации нового простого адаптера

adapter = new SimpleAdapter(v.getContext(), list, R.layout.listitem, new String[]{"BSSID", "strength"}, new int[] {R.id.BSSID, R.id.strength}); 
setListAdapter(adapter); 
Смежные вопросы