Wijden
Wijden

Reputation: 511

Android error with ListView in adapter : java.lang.ClassCastException

I'm facing this error in displaying a List View. The problem is in the adapter but I couldn't find the solution. This in my logcat :

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)

And this is my adapter :

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

}

And this is my activity :

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

}

I would greatly appreciate your help. Thanks in advance.

Upvotes: 2

Views: 4479

Answers (3)

rciovati
rciovati

Reputation: 28063

In your adapter change

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

with

LayoutInflater inflater = LayoutInflater.from(context);

I would also move this line from the getView to the class constructor, so you call it just one time.

But anyway, as also @geeth pointed, its a good practice to instantiate your adapter with the Activity context instead the Application one otherwise you could have some strange behaviour (for instance, if you activity is themed, using application context the wrong theme would be applied to your ListView rows)

Upvotes: 6

retromuz
retromuz

Reputation: 799

Replace below code

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

With

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

You will solve your issue.

Upvotes: 2

Rotem
Rotem

Reputation: 1482

You probably send the Application's context instead of the Activity's context. please say on which line you get the error.

Upvotes: 2

Related Questions