2012-03-23 121 views
1

我可以添加一個頭到列表視圖,當它在主要活動沒有問題,但是當我嘗試添加一個頭到列表視圖時,它是在一個異步任務,我得到一個演員錯誤。下面是主要的代碼(這是一個片段):Android - 添加頭到列表視圖

private List<IssueInfo> lIssueInfoList = null; 
private ListView lvIssues; 
private View v = null; 
TextView tvHeader; 

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

    try 
    { 
     v = inflater.inflate(R.layout.open_issues, container, false); 

     //Set listview of Issues. 
     lvIssues = (ListView) v.findViewById(R.id.lvIssues); 
     lvIssues.setOnItemClickListener(viewIssuesListener); 

     Context c = getActivity().getApplicationContext(); 
     LayoutInflater li = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ViewGroup vgHeader = (ViewGroup)li.inflate(R.layout.right_layout_header, null); 
     tvHeader = (TextView)vgHeader.findViewById(R.id.tvRightHeaderText); 

     //Call Async Task to run in the background. 
     new LoadIssuesTask().execute(); 

    } 
    catch (Exception e) 
    { 
     Errors.LogError(e); 
    } 
    return v;   
} 

和異步任務:

private class LoadIssuesTask extends AsyncTask<Void, Void, Void> { 

    ProgressDialog pdDialog = null; 

    protected void onPreExecute(){ 
     try 
     { 
      pdDialog = new ProgressDialog(v.getContext()); 
      pdDialog.setMessage("Loading Issues and Activities, please wait..."); 
      pdDialog.show(); 
     } 
     catch (Exception e) 
     { 
      Errors.LogError(e); 
     } 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     LoadIssues(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void v) { 
     lvIssues.addHeaderView(tvHeader); 
     lvIssues.setAdapter(new IssueInfoAdapter(OpenIssues.this.getView().getContext(), lIssueInfoList)); 
     pdDialog.dismiss(); 
     pdDialog = null; 
    } 
} 

最後,LoadIssues方法:

private void LoadIssues(){ 
    IssueInfoCreator IssueCreator = new IssueInfoCreator(OpenIssues.this.getView().getContext(), Integer.parseInt(AppPreferences.mDBVersion)); 
    IssueCreator.open(); 
    tvHeader.setText(OpenIssues.this.getView().getContext().getString(R.string.OpenIssues) + " (" + String.valueOf(IssueCreator.fetchIssueCount()) + ")"); 
    lIssueInfoList = IssueCreator.queryAll();   
    IssueCreator.close(); 

} 

這裏是我得到的錯誤:

03-23 16:46:42.741: E/AndroidRuntime(12805): FATAL EXCEPTION: main 
03-23 16:46:42.741: E/AndroidRuntime(12805): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 
03-23 16:46:42.741: E/AndroidRuntime(12805): at android.widget.ListView.clearRecycledState(ListView.java:513) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at android.widget.ListView.resetList(ListView.java:499) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at android.widget.ListView.setAdapter(ListView.java:442) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at com.adacel.SimCareDashboard.OpenIssues$LoadIssuesTask.onPostExecute(OpenIssues.java:107) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at com.adacel.SimCareDashboard.OpenIssues$LoadIssuesTask.onPostExecute(OpenIssues.java:1) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at android.os.AsyncTask.finish(AsyncTask.java:602) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at android.os.AsyncTask.access$600(AsyncTask.java:156) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at android.os.Looper.loop(Looper.java:137) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at java.lang.reflect.Method.invokeNative(Native Method) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at java.lang.reflect.Method.invoke(Method.java:511) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-23 16:46:42.741: E/AndroidRuntime(12805): at dalvik.system.NativeStart.main(Native Method) 

這是發生在t此行:

lvIssues.setAdapter(new IssueInfoAdapter(OpenIssues.this.getView().getContext(), lIssueInfoList)); 

任何想法?

UPDATE

@MisterSquonk

我是很新,Androind編程(只一直處於在1.5個月),所以我很感謝在哪裏以及如何事情應該和不應該做的提示。我相信我正確實施您的建議,但現在我得到一個Windows泄露錯誤....這裏的修改LoadIssues和異步任務:

private String LoadIssues(){ 
    IssueCreator = new IssueInfoCreator(OpenIssues.this.getView().getContext(), Integer.parseInt(AppPreferences.mDBVersion)); 
    IssueCreator.open(); 
    lIssueInfoList = IssueCreator.queryAll(); 
    return OpenIssues.this.getView().getContext().getString(R.string.OpenIssues) + " (" + String.valueOf(IssueCreator.fetchIssueCount()) + ")"; 
} 

private class LoadIssuesTask extends AsyncTask<Void, String, String> { 

    ProgressDialog pdDialog = null; 

    protected void onPreExecute(){ 
     try 
     { 
      pdDialog = new ProgressDialog(v.getContext()); 
      pdDialog.setMessage("Loading Issues and Activities, please wait..."); 
      pdDialog.show(); 
     } 
     catch (Exception e) 
     { 
      Errors.LogError(e); 
     } 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     return LoadIssues(); 
    } 

    @Override 
    protected void onPostExecute(String v) { 
     IssueCreator.close(); 
     tvHeader.setText(v); 
     lvIssues.addHeaderView(tvHeader); 
     lvIssues.setAdapter(new IssueInfoAdapter(OpenIssues.this.getView().getContext(), lIssueInfoList)); 
     pdDialog.dismiss(); 
     pdDialog = null; 
    } 
} 

是正確的嗎?

回答

0

那麼我不確定ClassCastException,但我可以告訴你,你不應該試圖從AsyncTaskdoInBackground(...)方法中操縱UI。

修改您LoadIssues()方法返回String要使用設置頁眉,進而有doInBackground(...)回報String結果到onPostExecute(...)方法和設置頁眉在那裏。

+0

我做了這些改變,但仍然得到相同的錯誤....不太清楚這裏發生了什麼... – Robert 2012-03-24 15:17:17

0

找到了answser .....這就是問題所在:

lvIssues.addHeaderView(tvHeader);

它應該是:

lvIssues.addHeaderView(vgHeader);

我加入的TextView的頭,而不是ViewGroup中。一旦我將ViewGroup變量移動到模塊級別並更改了上面的代碼行,它就完美了。

希望這可以幫助別人!