Mahyar
Mahyar

Reputation: 55

UnsupportedOperationException in creating custom ListView in Android

i wanted to have a custom listView so I did this:

Created an Activity:

public class PRS_MainList_Act extends ListActivity {
    MainListAdapter mladp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_prs__main_list_);
        ArrayList<MainMenuItem> menuItems = new ArrayList<MainMenuItem>();
        menuItems.add(new MainMenuItem(getResources().getString(R.string.main_list_connectivity), getResources().getString(R.string.main_list_connectivityDesc)));
        this.mladp = new MainListAdapter(this, R.layout.man_list_item, R.id.textView1, menuItems);
        setListAdapter(mladp);

    }
}

Create a class for menu items:

public class MainMenuItem {

    private String itemText;
    private String itemDescription;
    private String itemIMG;
    private int itemWeight;
    private String itemAssociatedActivity;

    public MainMenuItem(String itemText, String itemDescription) {
        this.itemText = itemText;
        this.itemDescription = itemDescription;
    }

    public String getItemText() {
        return itemText;
    }
    public void setItemText(String itemText) {
        this.itemText = itemText;
    }
    public String getItemIMG() {
        return itemIMG;
    }
    public void setItemIMG(String itemIMG) {
        this.itemIMG = itemIMG;
    }
    public int getItemWeight() {
        return itemWeight;
    }
    public void setItemWeight(int itemWeight) {
        this.itemWeight = itemWeight;
    }
    public String getItemAssociatedActivity() {
        return itemAssociatedActivity;
    }
    public void setItemAssociatedActivity(String itemAssociatedActivity) {
        this.itemAssociatedActivity = itemAssociatedActivity;
    }

    public String getItemDescription() {
        return itemDescription;
    }

    public void setItemDescription(String itemDescription) {
        this.itemDescription = itemDescription;
    }

}

Custom array adapter:

public class MainListAdapter extends ArrayAdapter<MainMenuItem> {

    ArrayList<MainMenuItem> menuItems;

    public MainListAdapter(Context context, int resource,
            int textViewResourceId, ArrayList<MainMenuItem> menuItems) {
        super(context, resource, textViewResourceId, menuItems);
        this.menuItems = menuItems;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            view = vi.inflate(R.layout.man_list_item, parent);
        }
        MainMenuItem it = menuItems.get(position);
        if (it != null) {
            TextView titleTV = (TextView) view.findViewById(R.id.textView1);
            TextView descriptionTV = (TextView) view.findViewById(R.id.textView2);
            ImageView iconIV = (ImageView)view.findViewById(R.id.imageView1);
            if (titleTV != null) {
                titleTV.setText(it.getItemText());
            }
            if(descriptionTV != null){
                descriptionTV.setText(it.getItemDescription());
            }
            if(iconIV != null){
                if(it.getItemText().equals(getContext().getResources().getString(R.string.main_list_connectivity)))
                    iconIV.setImageResource(R.drawable.network_connections);
            }
        }
        return view;
    }

}

and here are my activity layout and item layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".PRS_MainList_Act" >
    <ListView android:id="@android:id/list"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

</LinearLayout>

Item Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:src="@drawable/ic_launcher" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="Medium Text"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="TextView" />

    </LinearLayout>

</LinearLayout>

I got this error saying: java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView

Thanks in advance for your help.

Upvotes: 2

Views: 247

Answers (1)

user
user

Reputation: 87074

You can't use this version of the inflate method:

view = vi.inflate(R.layout.man_list_item, parent);

because this will add the inflated View to the parent, which isn't allowed in a ListView. Instead use this version:

view = vi.inflate(R.layout.man_list_item, parent, false);

which will inflate the view but will not add it to the parent. This version is important because it will provide the proper LayoutParams for your inflated view.

Upvotes: 5

Related Questions