Reputation: 511
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
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
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
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