2013-08-24 13 views
0

得到一個IllegalStateException異常SimpleAdapter.java:195和...界限時表示,從簡單的適配器 東西列表視圖中,你可以在這裏得到我的源代碼https://github.com/Wifin/WifinApp視圖IllegalStateException異常:android.widget.ListView是不是可以通過這個SimpleAdapter

代碼段1

public class MainActivity extends Activity 
{ 

    TextView txtlocation; 
    TextView txtstatus; 
    TextView txtinstant; 
    Button btn_loc; 
    Button btn_ser; 
    Button bnt_aploc; 
    ListView wifi_lv; 
    myLocation mlocal; 
    myWifi mwifi; 
    WifiReceiver mreceiver; 
    SimpleAdapter adapter; 
    ArrayList<HashMap<String, String>> arraylist; 
    String ITEM_KEY; 


    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     arraylist = new ArrayList<HashMap<String, String>>(); 
     ITEM_KEY = "key"; 

     adapter = new SimpleAdapter(
       this, 
       arraylist, 
       R.layout.activity_main, 
       new String[] { ITEM_KEY }, 
       new int[] { R.id.listView_wifi }); 

     txtlocation= (TextView) findViewById(R.id.locView); 
     btn_loc = (Button) this.findViewById(R.id.button_location); 
     btn_ser = (Button) this.findViewById(R.id.button_services); 
     bnt_aploc = (Button) this.findViewById(R.id.button_aploc); 
     wifi_lv =(ListView)findViewById(R.id.listView_wifi); 
     mlocal = new myLocation(); 
     mwifi =new myWifi(); 
     mreceiver =new WifiReceiver(); 

     mlocal.checkGoogleplay(this);  
     wifi_lv.setAdapter(adapter); 

     //mwifi.scanWifi(this.getApplicationContext()); 

     mwifi.wifi= (WifiManager) getSystemService(Context.WIFI_SERVICE); 


      btn_loc.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
        // TODO Auto-generated method stub 
       arraylist.clear(); 
        mlocal.getlocation(); 
        mwifi.scanWifi(); 
        mreceiver.getwifilist(MainActivity.this); 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

代碼段2

package com.example.Wifin; 

import java.util.HashMap; 
import java.util.List; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.wifi.ScanResult; 
import android.net.wifi.WifiManager; 

public class WifiReceiver extends BroadcastReceiver 
{ 

    List<ScanResult> wifilist; 
    int size=0; 
    double ap_rssi; 
    double ap_feq; 
    double distance; 
    String ssid; 


    @Override 
    public void onReceive(Context c, Intent i) { 
     // TODO Auto-generated method stub 
     System.out.println("111"); 
     if (i.getAction().equals(
       WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
     wifilist = ((WifiManager) c.getSystemService(Context.WIFI_SERVICE)).getScanResults(); 

    } 

    public void getwifilist (MainActivity ma) 
    { 
     if (wifilist!=null) 
     { 

     try { 
      size =wifilist.size()-1; 
      while (size >= 0) 
      {     
       ap_rssi = Double.valueOf(wifilist.get(size).level); 
       ap_feq = Double.valueOf(wifilist.get(size).frequency); 
       ssid = String.valueOf(wifilist.get(size).SSID); 

       distance=Math.pow(10, (Math.abs(ap_rssi)-20*Math.log10(ap_feq)-32.44)/20)*1000; 

       System.out.println("distance:"+(Math.round(distance*100))/100.0); 

       HashMap<String, String> item = new HashMap<String, String>(); 
       item.put(ma.ITEM_KEY, ssid +""+String.valueOf((Math.round(distance*100))/100.0)); 
       ma.arraylist.add(item); 
       size--; 
       } 
      } 
      catch (Exception e) { 

      } 
     } 
    } 

} 

目錄下載

08-25 01:25:55.427: E/AndroidRuntime(5009): FATAL EXCEPTION: main 
08-25 01:25:55.427: E/AndroidRuntime(5009): java.lang.IllegalStateException: android.widget.ListView is not a view that can be bounds by this SimpleAdapter 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:195) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.AbsListView.obtainView(AbsListView.java:2177) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1247) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.ListView.onMeasure(ListView.java:1159) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.View.measure(View.java:15848) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.RelativeLayout.measureChild(RelativeLayout.java:698) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:494) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.View.measure(View.java:15848) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.View.measure(View.java:15848) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.View.measure(View.java:15848) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.View.measure(View.java:15848) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.Choreographer.doFrame(Choreographer.java:532) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.os.Handler.handleCallback(Handler.java:730) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.os.Looper.loop(Looper.java:137) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at java.lang.reflect.Method.invoke(Method.java:525) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-25 01:25:55.427: E/AndroidRuntime(5009):  at dalvik.system.NativeStart.main(Native Method) 

回答

0

你傳遞作爲ListView的划動您使用的活動內容佈局(包含wifi ListView的佈局)以及to陣列中的ListView的編號(R.id.listView_wifi)。這將失敗,因爲適配器無法將數據直接綁定到ListView,並且您嘗試執行的操作不正確。

您想要在要綁定數據的SimpleAdapter中使用不同的佈局。一個簡單的解決方案,因爲你刨去一個String綁定到該行,就是用這樣的:

adapter = new SimpleAdapter(
       this, 
       arraylist, 
       android.R.layout.simple_list_item_1, 
       new String[] { ITEM_KEY }, 
       new int[] { android.R.id.text1 }); 
+0

實際上,我不想使用像simple_list_item_1這樣的新佈局來打開一個新頁面,我想要的只是將它們顯示在main_layout上,其id爲listView_wifi,正如您所說的,適配器無法直接將數據綁定到ListView ,那麼解決方案是什麼?劑量'ArrayAdapter'可以解決這個問題嗎? – atom2ueki

+0

我試過你的方法...它解決了我的問題,但我不理解你的評論「作爲ListView的行傳遞你用於活動內容的佈局(包含WiFi ListView的佈局)」,我的R. id.listView_wifi在R.layout.activity_main下,是否有來自android.R.layout.simple_list_item_1和android.R.id.text1的任何差異?你能解釋一下嗎?sry abt – atom2ueki

+0

@ atom2ueki *我想要的是在main_layout上顯示它們,它的id是listView_wifi * - 並且顯示它們如何?你在用什麼?R.id。listView_wifi''ListView'然後呢? – Luksprog

0

從SimpleAdapter文檔

實現可選中的圖(例如複選框)。期望的綁定值是一個布爾值。

TextView。期望的綁定值是一個字符串,並調用setViewText(TextView,String)。

ImageView。期望的綁定值是資源ID或字符串,並調用setViewImage(ImageView,int)或setViewImage(ImageView,String)。

看起來傳遞Object作爲映射對象與SimpleAdapter不兼容。更改對象類型,或者創建自定義適配器(我建議以後)

而且也試試這個鏈接

Android, ListView IllegalStateException: "The content of the adapter has changed but ListView did not receive a notification"

list view java.lang.IllegalStateException even after calling notifyDataSetCanged();

+0

所以我可以說,你的意思是簡單的適配器不適合我的HashMap的陣列?所以我會更好地使用自定義適配器? – atom2ueki

相關問題