Reputation: 41
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:
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
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
Reputation: 29
Add your values inside the arraylist or hashmap and sent to your Adapter. Use ViewHolder for effective ui element accessibility.
Upvotes: 1
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
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