简体   繁体   中英

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM