2012-03-23 19 views
1

Ich kann eine Kopfzeile zu einer Listenansicht hinzufügen, wenn es in der Hauptaktivität ohne Problem ist, aber wenn ich versuche, eine Kopfzeile zur Listview hinzuzufügen, wenn es in einer Async-Aufgabe ist, bekomme ich eine Umwandlung Error. Hier ist der Haupt-Code (es ist in einem Fragment):Android - Hinzufügen einer Kopfzeile zu einer Listenansicht

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;   
} 

und die ASync Aufgabe:

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; 
    } 
} 

Schließlich ist die LoadIssues Methode:

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(); 

} 

Hier ist der Fehler Ich erhalte :

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) 

Es geschieht a t diese Zeile:

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

Irgendwelche Ideen?

UPDATE

@MisterSquonk

Ich bin ziemlich neu Programmierung Androind (nur bei es 1,5 Monate gewesen), so schätze ich die Tipps, wo und wie die Dinge sollten und nicht getan werden sollte, . Ich glaube, ich Ihren Vorschlag richtig umgesetzt, aber ich bin immer einen jetzt sickerte Fehler von Windows .... hier ist der modifizierten LoadIssues und Async Aufgabe:

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; 
    } 
} 

Ist das richtig?

Antwort

0

Nun, ich bin mir nicht sicher über die ClassCastException, aber ich kann Ihnen sagen, dass Sie nicht versuchen sollten, die Benutzeroberfläche aus der doInBackground(...) Methode einer AsyncTask zu manipulieren.

Ändern Sie bitte Ihre LoadIssues() Methode der String Sie verwenden möchten zurückkehren, um den Header und wiederum zu setzen haben doInBackground(...) Rückkehr dass String als Folge der onPostExecute(...) Verfahren und stellen Sie den Header drin.

+0

Ich machte diese Änderungen, aber immer noch den gleichen Fehler .... nicht ganz sicher, was hier vor sich geht ... – Robert

0

die answser gefunden ..... Das war das Problem:

lvIssues.addHeaderView(tvHeader);

es sein sollte:

lvIssues.addHeaderView(vgHeader);

ich die Textview an den Header wurde hinzugefügt, nicht der Ansichtsgruppe Nachdem ich die ViewGroup-Variable auf eine Modulebene verschoben und die obige Codezeile geändert hatte, funktionierte sie perfekt.

Hoffe das hilft jemand anderem!

Verwandte Themen