我可以添加一個頭到列表視圖,當它在主要活動沒有問題,但是當我嘗試添加一個頭到列表視圖時,它是在一個異步任務,我得到一個演員錯誤。下面是主要的代碼(這是一個片段):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;
}
}
是正確的嗎?
我做了這些改變,但仍然得到相同的錯誤....不太清楚這裏發生了什麼... – Robert 2012-03-24 15:17:17