Android - ClassCastException - on LayoutParams from LinearLayout to AbsListView

I have a list adaptor that i'm trying to set a custom xml for (item.xml) if i dont use inflation (direct identifying the textview through an application context), it works perfectly.. but then my listview can't be themed..

public View getView(int position, View convertView, ViewGroup parent) {
        //System.gc();
        TextView tv;

        LayoutInflater inflater = getLayoutInflater();

        View row = View.inflate(mContext,R.layout.item,null); //.inflate(R.layout.item, parent, false); doesnt work either..
        String id = null;
        if (convertView == null) {
            tv =  (TextView) row.findViewById(R.id.TextView01);;
        } else
            tv = (TextView) convertView;

[..]

in logcat I am getting this..

    07-15 19:45:51.710: ERROR/AndroidRuntime(20185): FATAL EXCEPTION: main
        java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
        at android.widget.ListView.setupChild(ListView.java:1827)
        at android.widget.ListView.makeAndAddView(ListView.java:1794)
        at android.widget.ListView.fillDown(ListView.java:688)

my item.xml file is as follows:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_height="wrap_content"
          android:gravity="left|center"
          android:layout_width="fill_parent"
          android:paddingBottom="15px"
          android:background="#fff200"
          android:paddingTop="15px"
          android:paddingLeft="15px">

<TextView android:id="@+id/TextView01"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:textSize="40px"
          android:textStyle="bold"
          android:layout_marginLeft="20px"
          android:textColor="#0099CC">
</TextView>
</LinearLayout>

Answers


The problem is caused by wrapping the control you're returning from the adapter in a linearlayout. Lose the LinearLayout from your layout file (just put the TextView as the root) and I think it should work.

To expand slighly: you're creating your control, and then adding it into a LinearLayout. At this point a LinearLayout$LayoutParams object is allocated for it and set as its layout params. You then pull it out of the linear layout and put it into your list view, which doesn't understand the LinearLayout$LayoutParams.

Alternatively, return row from getView rather than (as I presume you are doing at the moment, as you have cut the return line out of your quoted code) returning tv.

(Another, unrelated hint: you are inflating your layout and then discarding it when convertView != null; this will result in poor scrolling performance on slow devices. Only perform the inflation if you're actually going to need it.)


you probably are returning the tv instead of row

public View getView(int position, View convertView, ViewGroup parent) {
    TextView tv;

    LayoutInflater inflater = getLayoutInflater();
    View row = View.inflate(mContext,R.layout.item,null);
    String id = null;
    if (convertView == null) {
        tv =  (TextView) row.findViewById(R.id.TextView01);;
    } else
        tv = (TextView) convertView;
    }
 return row;  // returning tv brings to ClassCast!

Did you try to use the layout inflater to inflate the static xml layout? Like this:

LayoutInflater li = LayoutInflater.from(context);
View rootView = li.inflate(R.layout.item, null);

A proper way to work with ArrayAdapter's getView for your code is this:

public View getView(int position, View convertView, ViewGroup parent) {
    //System.gc(); // Should not manually call gc
    View row;
    LayoutInflater inflater = getLayoutInflater();
    if (convertView == null) {
        row = inflater.inflate(R.layout.item, parent, false);
    } else
        row = convertView;

    TextView tv = (TextView) row.findViewById(R.id.TextView01);

Also, do not manually garbage collect in your code if possible.


I had the same problem and i used these codes :

public View getView(final int position, View convertView, ViewGroup parent) {
    convertView = G.layoutInflater.inflate(R.layout.list_lay_cities_markets, null);

    // your work 

    notifyDataSetChanged();
    return convertView;
}

This is the correct:

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    final ViewHolder holder;

    if(view==null){
        vi = inflater.inflate(R.layout.listview_row_myvideos,null);
        holder = new ViewHolder();
        holder.tv =  (TextView) vi.findViewById(R.id.TextView01);

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

public class ViewHolder{
    TextView tv;
}

Need Your Help

Navigation Drawer menu items selected within different groups

java android android-fragments navigation-drawer android-menu

I have a working Navigation Drawer and having some issues with menuItem.setChecked(true); when using groups and headers within the menu. It's not highlighting menu items as expected.