AddyProg
AddyProg

Reputation: 3050

Custom List Adapter Casting Exception

i am making a simple custom listView activity for wich i am setting a custom adapter with custom row style but when i run the application it gives me exception Here is the code i am trying

Custom Adapter

public class CustomListAdapter extends BaseAdapter {

     private ArrayList listData;
     private LayoutInflater layoutInflater;
     Activities Act = new Activities();

     public CustomListAdapter(Context context, ArrayList listData) {
            this.listData = listData;
            layoutInflater = LayoutInflater.from(context);
        }

     @Override
        public int getCount() {
            return listData.size();
        }

        @Override
        public Object getItem(int position) {
            return listData.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = layoutInflater.inflate(R.layout.message_row, null);
                holder = new ViewHolder();
                holder.titleView = (TextView) convertView.findViewById(R.id.title_tv);

                holder.timeView = (TextView) convertView.findViewById(R.id.time_tv);
                holder.refView = (TextView) convertView.findViewById(R.id.ref_tv);
                holder.detailsView = (TextView) convertView.findViewById(R.id.detail_tv);
                holder.matterView = (TextView) convertView.findViewById(R.id.date_tv);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }


            holder.titleView.setText(((Activities) listData.get(position)).getTitle());

            holder.timeView.setText(((Activities) listData.get(position)).getTime());
            holder.refView.setText(((Activities) listData.get(position)).getRef());
            holder.detailsView.setText(((Activities) listData.get(position)).getDetails());
           holder.matterView.setText(((Activities) listData.get(position)).getMatter());

            return convertView;
        }

        static class ViewHolder {
            TextView titleView;

            TextView timeView;
            TextView refView;
            TextView detailsView;
            TextView matterView;
        }

}

and here is the Activites class with getters setters

public class Activities implements Serializable 
{

    private static final long serialVersionUID = 2L;
    private String ref;
    private String details;
    private String time;
    private String title;
    private String matter;
    private String date;
    public String getMatter() {
        return matter;
    }
    public void setMatter(String matter) {
        this.matter = matter;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }

    public String getDetails() {
        return details;
    }
    public void setDetails(String details) {
        this.details = details;
    }

    public String getRef() {
        return ref;
    }
    public void setRef(String ref) {
        this.ref = ref;
    }

    public String getDate() {
        return date;
    }
    public void setDate(String ref) {
        this.date = date;
    }


}

And Here is what the LogCat says

01-08 12:11:28.784: E/AndroidRuntime(13273): FATAL EXCEPTION: main
01-08 12:11:28.784: E/AndroidRuntime(13273): java.lang.ClassCastException: java.lang.String cannot be cast to com.example.blavo_timeinn.Activities
01-08 12:11:28.784: E/AndroidRuntime(13273):    at com.example.blavo_timeinn.CustomListAdapter.getView(CustomListAdapter.java:59)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.AbsListView.obtainView(AbsListView.java:2084)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1249)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.ListView.onMeasure(ListView.java:1160)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.View.measure(View.java:12773)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.RelativeLayout.measureChild(RelativeLayout.java:579)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:392)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.View.measure(View.java:12773)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4788)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.View.measure(View.java:12773)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4788)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1374)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:663)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.View.measure(View.java:12773)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4788)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2105)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.View.measure(View.java:12773)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1149)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2583)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.os.Looper.loop(Looper.java:137)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at android.app.ActivityThread.main(ActivityThread.java:4511)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at java.lang.reflect.Method.invokeNative(Native Method)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at java.lang.reflect.Method.invoke(Method.java:511)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
01-08 12:11:28.784: E/AndroidRuntime(13273):    at dalvik.system.NativeStart.main(Native Method)

Here is how i am populating ListView

 final ArrayList<String> sData = new ArrayList<String>();
try{

            SQLiteDatabase db = openOrCreateDatabase("iTimeDB", MODE_PRIVATE, null);

            Cursor c2 = db.rawQuery("SELECT * FROM Activities", null);  
            if(c2 != null){

            if(c2.moveToFirst()){
                //  c2.moveToFirst();
                do{ 
                SetAct.setTitle(c2.getString(c2.getColumnIndex("Title")));
                SetAct.setDetails(c2.getString(c2.getColumnIndex("Details")));
                SetAct.setTime(c2.getString(c2.getColumnIndex("Time")));
                SetAct.setRef(c2.getString(c2.getColumnIndex("Ref")));
                SetAct.setMatter(c2.getString(c2.getColumnIndex("Matter")));
                SetAct.setMatter(c2.getString(c2.getColumnIndex("Date")));
                sData.add(SetAct.getMatter());
                sData.add(SetAct.getTime());
                sData.add(SetAct.getTitle());
                sData.add(SetAct.getRef());
                sData.add(SetAct.getDetails());


                Log.d("Title",c2.getString(c2.getColumnIndex("Title")));
                Log.d("Details",c2.getString(c2.getColumnIndex("Details")));
                Log.d("Time",SetAct.getTime());
                Log.d("Matter",c2.getString(c2.getColumnIndex("Matter")));
                    } while (c2.moveToNext());
                        }
        }







            c2.close();
            db.close();



            }

            catch(Exception e){
                e.printStackTrace();
                Log.v("YYY", e.toString());
            }
        final ListView listView = (ListView) findViewById(R.id.listView1);
        listView.setAdapter(new CustomListAdapter(this, sData));

Upvotes: 0

Views: 1959

Answers (4)

Raghunandan
Raghunandan

Reputation: 133560

java.lang.String cannot be cast to com.example.blavo_timeinn.Activities

Your listData is a arraylist of string type.

You need to check how you populate the list

You have this

 final ArrayList<String> sData = new ArrayList<String>()

This is what is passed to the constructor

So what you are doing is wrong casting string to Activities

To correct

 final ArrayList<Activities> sData = new ArrayList<Activities>();

Then

 for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
  Activites act = new Activities();
  String title =c2.getString(c2.getColumnIndex("Title")));
  String details =(c2.getString(c2.getColumnIndex("Details")));
  String time =c2.getString(c2.getColumnIndex("Time")));
  String ref= c2.getString(c2.getColumnIndex("Ref")));
  String matter =(c2.getString(c2.getColumnIndex("Matter")));
  String date = c2.getString(c2.getColumnIndex("Date")));
  act.setTitle(title);
  ...//  similarly for others
  sData.add(act); 
 }

Now pass sData to the constructor of adapter class

listView.setAdapter(new CustomListAdapter(this, sData));

Then

private ArrayList<Activities> listData;
public CustomListAdapter(Context context, ArrayList<Activities> listData) {
        this.listData = listData;
        layoutInflater = LayoutInflater.from(context);
}

Then in getView

  public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.message_row, null);
            holder = new ViewHolder();
            holder.titleView = (TextView) convertView.findViewById(R.id.title_tv);

            holder.timeView = (TextView) convertView.findViewById(R.id.time_tv);
            holder.refView = (TextView) convertView.findViewById(R.id.ref_tv);
            holder.detailsView = (TextView) convertView.findViewById(R.id.detail_tv);
            holder.matterView = (TextView) convertView.findViewById(R.id.date_tv);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Activities act = listData.get(position)
        holder.titleView.setText(act.getTitle());

        holder.timeView.setText(act.getTime());
        holder.refView.setText(act.getRef());
        holder.detailsView.setText(act.getDetails());
        holder.matterView.setText(act.getMatter());

        return convertView;
    }

Upvotes: 2

user3110424
user3110424

Reputation:

This is the reason you got the exception you are trying to cas ArrayList to Activity. Change private ArrayList listData; to private ArrayList<Activities > listData;

holder.titleView.setText(((Activities) listData.get(position)).getTitle()); 
holder.timeView.setText(((Activities) listData.get(position)).getTime());
holder.refView.setText(((Activities) listData.get(position)).getRef());
holder.detailsView.setText(((Activities) listData.get(position)).getDetails());
holder.matterView.setText(((Activities) listData.get(position)).getMatter());

Try like this

holder.titleView.setText(listData.get(position)).getTitle()); 

Upvotes: 0

GrIsHu
GrIsHu

Reputation: 23638

You are getting the error because of the below code where you have tried to cast your ArrayList into the Activity

    holder.titleView.setText(((Activities) listData.get(position)).getTitle());
        holder.timeView.setText(((Activities) listData.get(position)).getTime());
        holder.refView.setText(((Activities) listData.get(position)).getRef());
        holder.detailsView.setText(((Activities) listData.get(position)).getDetails());
       holder.matterView.setText(((Activities) listData.get(position)).getMatter());

Change your private ArrayList listData; to private ArrayList listData; as its should contains the data of the Activities which you have added into.

private ArrayList<Activities> listData;
 public CustomListAdapter(Context context, ArrayList<Activities> listData) {
            this.listData = listData;
            layoutInflater = LayoutInflater.from(context);
        }

Upvotes: 2

vipul mittal
vipul mittal

Reputation: 17401

You should specify in your array list about the kind of data it is going to hold. In you case it's activities. So that you wont have to type cast when you get items.

public class CustomListAdapter extends BaseAdapter {

     private ArrayList<Activities> listData;
     private LayoutInflater layoutInflater;
     Activities Act = new Activities();

     public CustomListAdapter(Context context, ArrayList<Activities> listData) {
            this.listData = listData;
            layoutInflater = LayoutInflater.from(context);
        }

     @Override
        public int getCount() {
            return listData.size();
        }

        @Override
        public Object getItem(int position) {
            return listData.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = layoutInflater.inflate(R.layout.message_row, null);
                holder = new ViewHolder();
                holder.titleView = (TextView) convertView.findViewById(R.id.title_tv);

                holder.timeView = (TextView) convertView.findViewById(R.id.time_tv);
                holder.refView = (TextView) convertView.findViewById(R.id.ref_tv);
                holder.detailsView = (TextView) convertView.findViewById(R.id.detail_tv);
                holder.matterView = (TextView) convertView.findViewById(R.id.date_tv);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }


            holder.titleView.setText(listData.get(position).getTitle());

            holder.timeView.setText(listData.get(position).getTime());
            holder.refView.setText(listData.get(position).getRef());
            holder.detailsView.setText(listData.get(position).getDetails());
           holder.matterView.setText(listData.get(position).getMatter());

            return convertView;
        }

        static class ViewHolder {
            TextView titleView;

            TextView timeView;
            TextView refView;
            TextView detailsView;
            TextView matterView;
        }

}

Upvotes: 0

Related Questions