Steve Tyler Garcia
Steve Tyler Garcia

Reputation: 41

ListView has "blank" rows

My listview size isn't updating according to the adapter, and I'm not sure why (This is happening after I filter based on some category, so I'll post the category filter as well) You can see after looking at the images that there are extra blank rows in the filtered tab. Image of the "All" Tab: enter image description here

enter image description here

Here is my getView method:

public View getView(int position,View view,ViewGroup parent) {
        LayoutInflater inflater = ctx.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.list_item, null, true);
        try {
            Item i = getForName(names.get(position));

            if (i.isCategory()) {
                rowView = inflater.inflate(R.layout.cat_item, null, true);
                TextView text = (TextView) rowView.findViewById(R.id.catTxt);
                text.setText(i.getTitle());
                text.setTypeface(null, Typeface.BOLD);
            } else {
                TextView text = (TextView) rowView.findViewById(R.id.listText);
                ImageView image = (ImageView) rowView.findViewById(R.id.listImage);
                try {
                    text.setText(names.get(position));
                    image.setImageResource(imageIds.get(position));
                } catch (Exception e) {
                }
            }
        } catch(Exception a ) {
             a.printStackTrace();
        }
        return rowView;
    };

And here is the category filter method:

public void filterCategories(Context context) {
        ArrayList<String> currNames = new ArrayList<>(); //List of the names in the current category (When we start looping)
        ArrayList<Integer> currImaages = new ArrayList<>(); //List of the drawable IDs in the current category (When we start looping)
        ArrayList<String> n = new ArrayList<>(); //Will be the finalized names list
        ArrayList<Integer > is = new ArrayList<>(); //Will be the finalized id list
        for(String name : names) {
            Item item = getForName(name);
            if(item != null)
                if(item.isCategory()) {
                    String cat = item.getAcronym();
                    for(String n1 : names) {
                        Item i1 = getForName(n1);
                        if(i1 != null && !i1.isCategory() && i1.getParent() != null && !currNames.contains(i1.getTitle())) {
                            if(i1.getParent().equals(cat)) {
                                currNames.add(n1);
                                currImaages.add(context.getResources().getIdentifier(getForName(n1).getThumbnail(), "drawable", context.getPackageName()));
                            }
                        }
                    }
                    n.add(name);
                    is.add(0);
                    int c = 0;
                    for(String x : currNames) {
                        n.add(x);
                        is.add(currImaages.get(c));
                        c++;
                    }

                }
            currNames = new ArrayList<>();
            currImaages = new ArrayList<>();
        }
        names = new ArrayList<>();
        imageIds = new ArrayList<>();
        for(String a : n) {
            names.add(a);
        }
        for(Integer a : is) {
            imageIds.add(a);
        }
        notifyDataSetChanged();
    }

Here's the output from a.printStackTrace():

06-04 09:51:38.835  17900-17900/packagename W/System.err﹕ java.lang.IndexOutOfBoundsException: Invalid index 9, size is 7
06-04 09:51:38.835  17900-17900/packagename W/System.err﹕ at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
06-04 09:51:38.835  17900-17900/packagename W/System.err﹕ at java.util.ArrayList.get(ArrayList.java:308)
06-04 09:51:38.835  17900-17900/packagename W/System.err﹕ at packagename.util.ListAdapter.getView(ListAdapter.java:46)
06-04 09:51:38.835  17900-17900/packagename W/System.err﹕ at android.widget.AbsListView.obtainView(AbsListView.java:2387)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.ListView.makeAndAddView(ListView.java:1864)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.ListView.fillDown(ListView.java:698)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.ListView.fillSpecific(ListView.java:1356)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.ListView.layoutChildren(ListView.java:1651)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.AbsListView.onLayout(AbsListView.java:2191)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.View.layout(View.java:15654)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4967)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1705)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1559)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.LinearLayout.onLayout(LinearLayout.java:1468)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.View.layout(View.java:15654)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4967)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:907)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.View.layout(View.java:15654)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4967)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.View.layout(View.java:15654)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4967)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:493)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.View.layout(View.java:15654)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4967)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.View.layout(View.java:15654)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4967)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1705)
06-04 09:51:38.836  17900-17900/packagename W/System.err﹕ at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1559)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.widget.LinearLayout.onLayout(LinearLayout.java:1468)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.View.layout(View.java:15654)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4967)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.View.layout(View.java:15654)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.ViewGroup.layout(ViewGroup.java:4967)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2102)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1859)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1078)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5875)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.Choreographer.doCallbacks(Choreographer.java:580)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.Choreographer.doFrame(Choreographer.java:550)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:739)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
06-04 09:51:38.837  17900-17900/packagename W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
06-04 09:51:38.841  17900-17900/packagename W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5299)
06-04 09:51:38.841  17900-17900/packagename W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
06-04 09:51:38.841  17900-17900/packagename W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
06-04 09:51:38.841  17900-17900/packagename W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
06-04 09:51:38.841  17900-17900/packagename W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

Upvotes: 1

Views: 1359

Answers (4)

Steve Tyler Garcia
Steve Tyler Garcia

Reputation: 41

Found the answer, turns out I am an idiot.

Just had to override getCount inside your adapter class.

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

Upvotes: 2

Pradeep
Pradeep

Reputation: 29

Add your values inside the arraylist or hashmap and sent to your Adapter. Use ViewHolder for effective ui element accessibility.

Upvotes: 1

Amsheer
Amsheer

Reputation: 7131

The issue is your handling getView method wrong. Here i am going to add an sample code.

Step 1 You need a viewHolder class like this. Add your inflated xml widgets here:

 /********* Create a holder Class to contain inflated xml file elements *********/
         public static class ViewHolder{

             public TextView text;
             public TextView text1;
             public TextView textWide;
             public ImageView image;

         }

Step 2

In your getView method

/****** Depends upon data size called for each row , Create each ListView row *****/


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

                 View vi = convertView;
                 ViewHolder holder;

                 if(convertView==null){

                     /****** Inflate tabitem.xml file for each row ( Defined below ) *******/
                     vi = inflater.inflate(R.layout.tabitem, null);

                     /****** View Holder Object to contain tabitem.xml file elements ******/

                     holder = new ViewHolder();
                     holder.text = (TextView) vi.findViewById(R.id.text);
                     holder.text1=(TextView)vi.findViewById(R.id.text1);
                     holder.image=(ImageView)vi.findViewById(R.id.image);

                    /************  Set holder with LayoutInflater ************/
                     vi.setTag( holder );
                 }
                 else 
                     holder=(ViewHolder)vi.getTag();
     return vi;
    }

This is sample ask any doubts

Upvotes: 1

Ero
Ero

Reputation: 520

I can't see from the code you posted but I think your adapter doesn't see any changes because it still has a reference to the original list you used. Instead of creating new lists for the adapter when you filter, update the original one.

So, instead of using this:

ArrayList<String> n = new ArrayList<>(); //Will be the finalized names list

just updated the names array

MORE: Just a helpful hint, your getView() is inflating a view every time and that gets expensive. A popular way is to use the viewHolder pattern. Lars Vogella has a great tutorial on this: http://www.vogella.com/tutorials/AndroidListView/article.html#adapterperformance_holder

Upvotes: 0

Related Questions