2014-11-14 25 views
0

正在使用可擴展列表視圖來加載來自DB的數據使用異步任務。當我加載在擴展列表大約10到15個數據查看其做工精細,當我加載更重要的是它會引發錯誤,當我點擊適配器的內容已經改變父項但ListView控件沒有收到通知如何在Expandable Listview中解決錯誤「適配器的內容已更改但ListView未收到通知」?

異步任務類

public class All_call_asyc extends AsyncTask<String, Void, String> { 

Activity activity; 

Fragment fragment = null; 
FragmentManager frgManager; 
FragmentTransaction ft; 

DatabaseHandler db; 
ImageView progress_bar; 
AnimationDrawable frameAnimation; 

Bundle b = new Bundle(); 
public All_call_asyc(Activity activity, FragmentManager frgManager, ImageView progress_bar) { 
    // TODO Auto-generated constructor stub 
    this.activity = activity; 
    this.frgManager = frgManager; 
    this.progress_bar = progress_bar; 
} 

protected void onPreExecute() { 
    progress_bar.setVisibility(View.VISIBLE); 
    frameAnimation = (AnimationDrawable) progress_bar.getBackground(); 
    frameAnimation.start(); 
} 

protected String doInBackground(String... params) { 

    db = new DatabaseHandler(activity); 
    Constant.whole_array.clear(); 
    Constant.whole_array = db.getInfo("ALL",params[0],params[1]); 
    db.get_parent_item(params[0],params[1]); 

    return ""; 
} 

protected void onPostExecute(String result) { 

    if (Constant.parentItems.size()>0) { 
     fragment = new All_calls(); 
     ft = frgManager.beginTransaction(); 
     ft.replace(R.id.frame_content, fragment); 
     ft.addToBackStack(null); 
     ft. commitAllowingStateLoss(); 
    }else{ 
     fragment = new Error_lay(); 
     ft = frgManager.beginTransaction(); 
     ft.replace(R.id.frame_content, fragment); 
     ft.addToBackStack(null); 
     b.putString("error", "There is no call details"); 
     fragment.setArguments(b); 
     ft. commitAllowingStateLoss(); 
    } 
    frameAnimation.stop(); 
    progress_bar.setVisibility(View.GONE); 

} 
} 

Fragments類

public class All_calls extends Fragment{ 

ExpandableListView lv_allcalls,List_lay; 
All_call_exp_adp exp_adp; 
FragmentManager frgManager; 
int lastExpandedPosition = -1; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    if (container == null) { 
     return null; 
    } 
    List_lay = (ExpandableListView) inflater.inflate(R.layout.all_calls, container, false); 

    DisplayMetrics metrics = new DisplayMetrics(); 
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    int width = metrics.widthPixels; 

    frgManager = getActivity().getSupportFragmentManager(); 
    lv_allcalls = (ExpandableListView)List_lay.findViewById(R.id.all_call_lv); 

    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     lv_allcalls.setIndicatorBounds(width - GetPixelFromDips(50), width - GetPixelFromDips(10)); 
    } else { 
     lv_allcalls.setIndicatorBoundsRelative(width - GetPixelFromDips(50), width - GetPixelFromDips(10)); 
    } 

    lv_allcalls.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { 

     @Override 
     public void onGroupExpand(int groupPosition) { 
      if (lastExpandedPosition != -1 
        && groupPosition != lastExpandedPosition) { 
       lv_allcalls.collapseGroup(lastExpandedPosition); 
      } 
      lastExpandedPosition = groupPosition; 
     } 
    }); 

    MainActivity.inc_total_time.setText(Constant.inc_going_duration); 
    MainActivity.out_total_time.setText(Constant.out_going_duration); 

    exp_adp = new All_call_exp_adp(getActivity(),Constant.parentItems,Constant.childData); 
    lv_allcalls.setAdapter(exp_adp); 
    exp_adp.notifyDataSetChanged(); 


    return List_lay; 
} 

public int GetPixelFromDips(float pixels) { 
    // Get the screen's density scale 
    final float scale = getResources().getDisplayMetrics().density; 
    // Convert the dps to pixels, based on density scale 
    return (int) (pixels * scale + 0.5f); 
} 
} 

錯誤日誌 - 貓

11-15 10:11:39.405: E/MessageQueue-JNI(26262): 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. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131230810, class android.widget.ExpandableListView) with Adapter(class android.widget.ExpandableListConnector)] 
11-15 10:11:39.405: E/MessageQueue-JNI(26262): at android.widget.ListView.layoutChildren(ListView.java:1555) 
11-15 10:11:39.405: E/MessageQueue-JNI(26262): at android.widget.AbsListView.onTouchUp(AbsListView.java:3624) 
11-15 10:11:39.405: E/MessageQueue-JNI(26262): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3436) 
11-15 10:11:39.405: E/MessageQueue-JNI(26262): at android.view.View.dispatchTouchEvent(View.java:7736) 
11-15 10:11:39.405: E/MessageQueue-JNI(26262): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2212) 
11-15 10:11:39.405: E/MessageQueue-JNI(26262): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945) 
11-15 10:11:39.405: E/MessageQueue-JNI(26262): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218) 
11-15 10:11:39.405: E/MessageQueue-JNI(26262): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 
11-15 10:11:39.405: E/MessageQueue-JNI(26262): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218) 

我不能夠解決這個issue.Can任何一個知道幫我解決這個問題。

+0

您可以顯示異常堆棧跟蹤 – 2014-11-14 13:12:46

+0

@EldhoseMBabu更新了Log-Cat中的錯誤。 – Yugesh 2014-11-15 04:46:26

回答

1

要解決此錯誤,您需要在AsyncTask的方法中更新您的UI。這意味着您必須將您的自定義適配器設置爲您的All_call_asyc類的方法中的ExpandableListView

exp_adp = new All_call_exp_adp(getActivity(),Constant.parentItems,Constant.childData); 
lv_allcalls.setAdapter(exp_adp); 
exp_adp.notifyDataSetChanged(); 
+0

它的工作正常,但有點延遲顯示進度欄解僱後可擴展列表視圖中的數據。 – Yugesh 2014-11-15 17:08:50

相關問題