Loading multiple layout in ListView

935 views Asked by At

I am trying to display multiple layout in my listview. I am having only three items in list view and each row is having a different layout. Here is the code I am using for that

private class CompetitionDetailsAdapter extends ArrayAdapter<Article> {


public CompetitionDetailsAdapter(Context context, int textViewResourceId
                ) {
            super(context, 0);
            // TODO Auto-generated constructor stub
        }

        @Override
        public int getCount() {
            return 3;
        }

        @Override
        public int getItemViewType(int position) {
            return position;
        }

        @Override
        public int getViewTypeCount() {
            return 3;
        }



        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {
            // TODO Auto-generated method stub
            //return super.getView(position, convertView, parent);
            LayoutInflater inflater=getLayoutInflater();
            int type = getItemViewType(position);
            switch(type)
            {
                case 0:
                {
                    View headerCell = inflater.inflate(R.layout.rsscellheader, null);
                    ImageView imageView = (ImageView)headerCell.findViewById(R.id.headerCellImage);
                    TextView title = (TextView)headerCell.findViewById(R.id.txt_HeaderCellTitle);
                    TextView date = (TextView)headerCell.findViewById(R.id.txt_HeaderCellDate);
                    Activity activity = (Activity) getContext();
                    imageLoader.DisplayImage(appDeleg.getSelectedCompetition().getImage(), activity, imageView);
                    return headerCell;
                    //break;
                }
                case 1:
                {
                    View webViewCell = inflater.inflate(R.layout.rsswebviewcell, null);
                    WebView webView = (WebView)webViewCell.findViewById(R.id.webView);
                    webView.loadData(appDeleg.getSelectedCompetition().getDescription(), "text/html", "utf-8");
                    return webViewCell;
                }
                case 2:
                {
                    View buttonCell = inflater.inflate(R.layout.rssbuttoncell, null);
                    ImageButton btnWebView = (ImageButton)buttonCell.findViewById(R.id.btn_WebView);
                    return btnWebView;
                }
            }
            return convertView;
        }
    }

But while running its crashing and giving error

10-25 14:00:14.298: ERROR/AndroidRuntime(3102): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
10-25 14:00:14.298: ERROR/AndroidRuntime(3102):     at android.widget.ListView.measureScrapChild(ListView.java:1117)
10-25 14:00:14.298: ERROR/AndroidRuntime(3102):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1200)
10-25 14:00:14.298: ERROR/AndroidRuntime(3102):     at android.widget.ListView.onMeasure(ListView.java:1109)
10-25 14:00:14.298: ERROR/AndroidRuntime(3102):     at android.view.View.measure(View.java:8172)

Could someone help please? How can I do this in android? Thanks

2

There are 2 answers

0
Jovan On

I think that your mistake is that you are trying to put more than a 3 item in a list, and when your list is bigger than that it's showing you a mistake... try with this:

private class CompetitionDetailsAdapter extends ArrayAdapter<Article> {
int i =0;

public CompetitionDetailsAdapter(Context context, int textViewResourceId
                ) {
            super(context, 0);
            // TODO Auto-generated constructor stub
        }

        @Override
        public int getCount() {
            return 3;
        }

        @Override
        public int getItemViewType(int position) {
            return position;
        }

        @Override
        public int getViewTypeCount() {
            return 3;
        }



        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {
            // TODO Auto-generated method stub
            //return super.getView(position, convertView, parent);
            LayoutInflater inflater=getLayoutInflater();

            switch(i)
            {
                case 0:
                {
                    View headerCell = inflater.inflate(R.layout.rsscellheader, null);
                    ImageView imageView = (ImageView)headerCell.findViewById(R.id.headerCellImage);
                    TextView title = (TextView)headerCell.findViewById(R.id.txt_HeaderCellTitle);
                    TextView date = (TextView)headerCell.findViewById(R.id.txt_HeaderCellDate);
                    Activity activity = (Activity) getContext();
                    imageLoader.DisplayImage(appDeleg.getSelectedCompetition().getImage(), activity, imageView);
                    return headerCell;
                    i++;
                    //break;
                }
                case 1:
                {
                    View webViewCell = inflater.inflate(R.layout.rsswebviewcell, null);
                    WebView webView = (WebView)webViewCell.findViewById(R.id.webView);
                    webView.loadData(appDeleg.getSelectedCompetition().getDescription(), "text/html", "utf-8");
                    i++;
                    return webViewCell;
                }
                case 2:
                {
                    View buttonCell = inflater.inflate(R.layout.rssbuttoncell, null);
                    ImageButton btnWebView = (ImageButton)buttonCell.findViewById(R.id.btn_WebView);
                    i = 0;
                    return btnWebView;
                }
            }
            return convertView;
        }
    }
0
Zach On

I found the issue. Its an error with the return type in case 2. Instead of view I was returning a ImageButton Here is the correct code

case 2:
{     
    View buttonCell = inflater.inflate(R.layout.rssbuttoncell, null);
    ImageButton btnWebView = (ImageButton)buttonCell.findViewById(R.id.btn_WebView);

    return buttonCell;
}