2014-11-02 36 views
0

我在不同版本的Android和不同設備上收到此錯誤。我在幾臺設備上測試了它,並沒有得到這個問題,但在某些設備上不斷顯示我這個錯誤android -java.lang.IllegalStateException:適配器的內容已更改,但ListView未收到適配器的通知

這是ListAdapter代碼:

ListAdapter ladap; 

private class GetContacts extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... arg0) { 
     Spots_tab1_json sh = new Spots_tab1_json(); 
     String jsonStr = sh.makeServiceCall(url + page, Spots_tab1_json.GET); 

     if (jsonStr != null) { 
      try { 
       JSONObject jsonObj = new JSONObject(jsonStr); 
       contacts = jsonObj.getJSONArray(TAG_CONTACTS); 

        for (int i = 0; i < contacts.length(); i++) { 
        JSONObject c = contacts.getJSONObject(i); 
        String id = new String(c.getString("id").getBytes("ISO-8859-1"), "UTF-8"); 
        String dates = new String(c.getString("dates").getBytes("ISO-8859-1"), "UTF-8"); 
        String price = new String(c.getString("gheymat").getBytes("ISO-8859-1"), "UTF-8"); 
        HashMap<String, String> contact = new HashMap<String, String>(); 
        contact.put("id", id); 
        contact.put("dates", dates); 
        contact.put("price", price); 
        contactList.add(contact); 
       } 
       } 
      } catch (JSONException e) { 
       goterr = true; 
      } catch (UnsupportedEncodingException e) { 
       goterr = true; 
      } 
     } else { 
      goterr = true; 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     if (!isCancelled() && goterr == false) { 
      if(ladap==null){ 
       ladap=new ListAdapter(MainActivity.this, contactList); 
       lv.setAdapter(ladap); 
      }else{ 
       ladap.addAll(contactList); 
      } 
    } 
} 


public class ListAdapter extends BaseAdapter { 
    Activity activity; 
    public ArrayList<HashMap<String, String>> list; 

    public ListAdapter(Activity activity,ArrayList<HashMap<String, String>> list) { 
     super(); 
     this.activity = (Activity) activity; 
     this.list = list; 
    } 

    public void addAll(ArrayList<HashMap<String, String>> contactList) { 
     this.list = contactList; 
     notifyDataSetChanged(); 
    } 

    public int getCount() { 
     return contactList.size(); 
    } 

    public Object getItem(int position) { 
     return contactList.get(position); 
    } 

    public long getItemId(int arg0) { 
     return 0; 
    } 

    private class ViewHolder { 
     TextView title,price; 
     ImageView img ; 
     //RelativeLayout rl; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     LayoutInflater inflater = activity.getLayoutInflater(); 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.item, null); 
      holder = new ViewHolder(); 
      holder.title = (TextView) convertView.findViewById(R.id.title); 
      holder.price = (TextView) convertView.findViewById(R.id.price); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

      item = contactList.get(position); 
      holder.price.setText(item.get("price")); 
     return convertView; 
    } 
} 
在上面的代碼

,當談到onpostExcecute(),則檢查ladab爲null,如果它爲空並且創建ListAdapter(我已經記錄並且它只會進入一次),然後,它將涉及addAll方法和將新項目添加到適配器。

這是日誌:

STACK_TRACE = java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131034188, class android.widget.ListView) with Adapter(class xx.xx.MainActivity$ListAdapter)] 
at android.widget.ListView.layoutChildren(ListView.java:1517) 
at android.widget.AbsListView.onLayout(AbsListView.java:1925) 
at android.view.View.layout(View.java:7462) 
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:962) 
at android.view.View.layout(View.java:7462) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1268) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1140) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1057) 
at android.view.View.layout(View.java:7462) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
at android.view.View.layout(View.java:7462) 
at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:743) 
at android.view.View.layout(View.java:7462) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1268) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1140) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1057) 
at android.view.View.layout(View.java:7462) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
at android.view.View.layout(View.java:7462) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1268) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1140) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1057) 
at android.view.View.layout(View.java:7462) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
at android.view.View.layout(View.java:7462) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
at android.view.View.layout(View.java:7462) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1140) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3694) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
at dalvik.system.NativeStart.main(Native Method) 

這是什麼代碼的問題?我盡我所能,但我沒有設法解決它。

你能幫我嗎/

謝謝

回答

0

嘗試把你的onPostExecute方法的代碼爲runOnUiThread

if (!isCancelled() && goterr == false) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      if(ladap==null){ 
       ladap=new ListAdapter(MainActivity.this, contactList); 
       lv.setAdapter(ladap); 
      }else{ 
       ladap.addAll(contactList); 
      } 
     } 
    }); 
} 
+0

不onPostExecute是否在UI線程上運行? – 2014-11-02 07:07:18

1

我得到了你的代碼有點混淆這裏:

if (!isCancelled() && goterr == false) { 
     if(ladap==null){ 
      ladap=new ListAdapter(MainActivity.this, contactList); 
      lv.setAdapter(ladap); 
     }else{ 
      ladap.addAll(contactList); 
     } 
} 

假設代碼第一次運行其中:

isCancelled()是假

goterr是假

ladap將是無效的,因爲它沒有被創建。

如果這些發生了3,ladap.addAll(contactList);叫,因爲if(ladap==null)true

儘量做到這樣的:

if (!isCancelled() && goterr == false) { 
     if(ladap==null){ 
      ladap=new ListAdapter(MainActivity.this, contactList); 
      lv.setAdapter(ladap); 
     } 
     ladap.addAll(contactList); //no neet for else 

} 

UPDATE

試試這個:

if (!isCancelled() && goterr == false) { 
     if(ladap==null){ 
      ladap=new ListAdapter(MainActivity.this, contactList); 
      lv.setAdapter(ladap); 
     } 
     ladap.addAll(contactList); //no neet for else 
     lv.invalidateViews(); 
     //lv.invalidate(); //try to call this if invalidateViews is not working, do some trial - error here 
} 

或者,你可以移動ladap=new ListAdapter(MainActivity.this, contactList);並設置其adapteronCreate

+0

感謝您的回覆,我仍然有問題。我做了你所說的,但它沒有解決我的問題。你認爲是什麼問題?任何猜測?謝謝 – 2014-11-05 09:09:39

+1

@johnsmoth嗯......奇怪。請看我最新的答案,並讓我知道 – 2014-11-05 09:37:02

相關問題