2013-04-30 61 views
2

我在顯示列表視圖時遇到此錯誤。問題出在適配器上,但我找不到解決方案。這在我的logcat:適配器中的ListView導致Android錯誤:java.lang.ClassCastException

FATAL EXCEPTION: main 

    java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity 
    at com.client.alm.WorkItemAdapter.getView(WorkItemAdapter.java:47) 
    at android.widget.AbsListView.obtainView(AbsListView.java:2159) 
    at android.widget.ListView.measureHeightOfChildren(ListView.java:1246) 
    at android.widget.ListView.onMeasure(ListView.java:1158) 
    at android.view.View.measure(View.java:15513) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827) 

這是我的適配器:

import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.client.alm.model.WorkItem; 
import com.client.alm.model.WorkItemContainer; 

public class WorkItemAdapter extends ArrayAdapter<WorkItem> { 

    private WorkItemContainer container; 
    private Context context; 
    int layoutResourceId; 

    public WorkItemAdapter(Context context, int layoutResourceId, 
      WorkItemContainer container) { 
     super(context, layoutResourceId,container.getWorkitems()); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.container = container; 
    } 

    static class ViewHolder { 
     ImageView imageType; 
     TextView type; 
     TextView priority; 
     ImageView imagePriority; 
     TextView key; 
     ImageView imageStatus; 
     TextView status; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ViewHolder holder = null; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new ViewHolder(); 
      holder.imageType = (ImageView) row 
        .findViewById(R.id.imageTypeWorkitem); 
      holder.type = (TextView) row.findViewById(R.id.typeWorkitem); 
      holder.imagePriority = (ImageView) row 
        .findViewById(R.id.imagePriority); 
      holder.key = (TextView) row.findViewById(R.id.key); 
      holder.imageStatus = (ImageView) row.findViewById(R.id.imageStatus); 
      holder.status = (TextView) row.findViewById(R.id.status); 

      row.setTag(holder); 
     } else { 
      holder = (ViewHolder) row.getTag(); 
     } 

     WorkItem workitem = container.getWorkitems().get(position); 
     holder.type.setText(workitem.getType()); 
     // holder.imageType.setImageResource(workitem.getIcon()); 
     holder.priority.setText(workitem.getPriority()); 
     holder.key.setText(workitem.getKey()); 
     holder.status.setText(workitem.getStatus()); 

     return row; 
    } 

} 

這是我的活動:

import java.lang.reflect.Type; 
import java.util.List; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 

import com.client.alm.model.WorkItem; 
import com.client.alm.model.WorkItemContainer; 
import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class WorkItemActivity extends Activity { 
    /** Called when the activity is first created. */ 

    // Progress Dialog 
    private ProgressDialog pDialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.wokitemlist); 

     new LoadWorkitem().execute(); 
    } 

    /** 
    * Background Async Task to Load all Workitems by making HTTP Request 
    * */ 
    class LoadWorkitem extends AsyncTask<String, String, String> { 

     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(WorkItemActivity.this); 
      pDialog.setMessage("Loading Workitems ..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     /** 
     * getting JSON 
     * */ 
     @Override 
     protected String doInBackground(String... params) { 
      RestClient rc = new RestClient(
        "http://10.0.2.2:8080/SpringRestWebServices/rest/workitem/getworkitem"); 

      try { 
       rc.Execute(RequestMethod.GET); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return rc.getResponse(); 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     @Override 
     protected void onPostExecute(String resultat) { 
      // dismiss the dialog after getting all products 
      pDialog.dismiss(); 

      Gson gson = new Gson(); 
      WorkItemContainer container = gson.fromJson(resultat, 
        WorkItemContainer.class); 

      /** 
      * Updating parsed JSON data into ListView 
      * */ 
      WorkItemAdapter adaptateur = new WorkItemAdapter(
        getApplicationContext(), R.layout.workitemitem, container); 

      ListView listViewWorkitem = (ListView) findViewById(R.id.list); 

      listViewWorkitem.setAdapter(adaptateur); 
      super.onPostExecute(resultat); 
     } 
    } 

} 

我將非常感謝您的幫助。提前致謝。

回答

6

在您的適配器變化

LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 

LayoutInflater inflater = LayoutInflater.from(context); 

我也將移動從getView到類的構造函數這一行,所以你怎麼稱呼它只是一個時間。

但不管怎麼說,作爲還@geeth尖,它的一個很好的做法與Activity上下文來實例化適配器,而不是一個Application否則你可能有一些奇怪的行爲(例如,如果你的活動是主題,使用應用程序上下文錯誤的主題將應用於您的ListView行)

+0

謝謝,我做了你所說的,但我得到這個新的錯誤,我更新了我的問題。感謝您的幫助 – Wijden 2013-04-30 15:14:08

+0

我很高興幫助,但您無法改變這個問題。如果還有其他問題,請提出另一個問題。 – rciovati 2013-04-30 15:15:19

+0

好吧,我要再問一個問題謝謝 – Wijden 2013-04-30 15:21:16

2

您可能會發送應用程序的context而不是活動的context。 請說出哪一行出現錯誤。

2

替換下面的代碼

/** 
     * Updating parsed JSON data into ListView 
     * */ 
     WorkItemAdapter adaptateur = new WorkItemAdapter(
       getApplicationContext(), R.layout.workitemitem, container); 

隨着

/** 
     * Updating parsed JSON data into ListView 
     * */ 
     WorkItemAdapter adaptateur = new WorkItemAdapter(
       WorkItemActivity.this, R.layout.workitemitem, container); 

您將解決您的問題。