TonicArtos / StickyGridHeaders

This project has been superseded by SuperSLiM, a layout manager for RecyclerView. I strongly recommend using SuperSLiM and not StickyGridHeaders.
http://tonicartos.com
Apache License 2.0
1.47k stars 442 forks source link

get array index out of bound exception #41

Closed shalommelamed closed 11 years ago

shalommelamed commented 11 years ago

Hey, I have a vector with three element. and two headers. the data is correct but the adapter call to getView with position 3 - position that does not exist.

thank's in advance to all who can help.

the exception i get is: 07-18 01:36:04.574: E/AndroidRuntime(27942): FATAL EXCEPTION: main 07-18 01:36:04.574: E/AndroidRuntime(27942): java.lang.ArrayIndexOutOfBoundsException: length=3; index=3 07-18 01:36:04.574: E/AndroidRuntime(27942): at java.util.Vector.arrayIndexOutOfBoundsException(Vector.java:907) 07-18 01:36:04.574: E/AndroidRuntime(27942): at java.util.Vector.elementAt(Vector.java:328) 07-18 01:36:04.574: E/AndroidRuntime(27942): at java.util.Vector.get(Vector.java:442) 07-18 01:36:04.574: E/AndroidRuntime(27942): at fragments.SalesStickyGVAdapter.getItem(SalesStickyGVAdapter.java:39) 07-18 01:36:04.574: E/AndroidRuntime(27942): at fragments.SalesStickyGVAdapter.getView(SalesStickyGVAdapter.java:52) 07-18 01:36:04.574: E/AndroidRuntime(27942): at com.tonicartos.widget.stickygridheaders.StickyGridHeadersBaseAdapterWrapper.getView(StickyGridHeadersBaseAdapterWrapper.java:179) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.AbsListView.obtainView(AbsListView.java:2159) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.GridView.makeAndAddView(GridView.java:1341) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.GridView.makeRow(GridView.java:341) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.GridView.fillDown(GridView.java:283) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.GridView.fillFromTop(GridView.java:417) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.GridView.layoutChildren(GridView.java:1229) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.AbsListView.onLayout(AbsListView.java:1994) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.View.layout(View.java:14008) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewGroup.layout(ViewGroup.java:4373) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.View.layout(View.java:14008) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewGroup.layout(ViewGroup.java:4373) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.View.layout(View.java:14008) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewGroup.layout(ViewGroup.java:4373) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.View.layout(View.java:14008) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewGroup.layout(ViewGroup.java:4373) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:653) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.View.layout(View.java:14008) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewGroup.layout(ViewGroup.java:4373) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.View.layout(View.java:14008) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewGroup.layout(ViewGroup.java:4373) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.View.layout(View.java:14008) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewGroup.layout(ViewGroup.java:4373) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.View.layout(View.java:14008) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewGroup.layout(ViewGroup.java:4373) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.Choreographer.doFrame(Choreographer.java:532) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.os.Handler.handleCallback(Handler.java:725) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.os.Handler.dispatchMessage(Handler.java:92) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.os.Looper.loop(Looper.java:137) 07-18 01:36:04.574: E/AndroidRuntime(27942): at android.app.ActivityThread.main(ActivityThread.java:5041) 07-18 01:36:04.574: E/AndroidRuntime(27942): at java.lang.reflect.Method.invokeNative(Native Method) 07-18 01:36:04.574: E/AndroidRuntime(27942): at java.lang.reflect.Method.invoke(Method.java:511) 07-18 01:36:04.574: E/AndroidRuntime(27942): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 07-18 01:36:04.574: E/AndroidRuntime(27942): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 07-18 01:36:04.574: E/AndroidRuntime(27942): at dalvik.system.NativeStart.main(Native Method)

my code in the adapter is:

package fragments;

import java.util.Vector; import robototext.RobotoTextView; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.out.App; import com.out.goout.R; import com.tonicartos.widget.stickygridheaders.StickyGridHeadersBaseAdapter;

import entitys.SaleObj;

public class SalesStickyGVAdapter extends BaseAdapter implements StickyGridHeadersBaseAdapter { private Context mContext; private Vector items; private String [] headers;

public SalesStickyGVAdapter(Context mContext, String [] headers, Vector<SaleObj> sales)
{
    this.mContext = mContext;
    this.items = sales;

    this.headers = headers;
}

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

@Override
public SaleObj getItem(int position) 
{   
    return items.get(position);
}

@Override
public long getItemId(int position) 
{       
    return items.get(position).hashCode();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{       
    ChildView holder;
    SaleObj currentSaleObj = getItem(position);

    if(convertView == null)
    {
        holder = new ChildView();
        convertView = LayoutInflater.from(mContext).inflate(R.layout.sale_row_child_layout, null);
        holder.tvPubName = (RobotoTextView)convertView.findViewById(R.id.tv_sale_pub_name);
        holder.tvSaleDescription = (RobotoTextView)convertView.findViewById(R.id.tv_sale_description);

        convertView.setTag(holder);
    }
    else
    {
        holder = (ChildView)convertView.getTag();
    }

    //get the pub name
    holder.tvPubName.setText(App.pubById.get(currentSaleObj.pubSaleRelation.toString()).pubName);
    holder.tvSaleDescription.setText(currentSaleObj.saleDescription);

    return convertView;
}

private class ChildView
{
    private RobotoTextView tvPubName;
    private RobotoTextView tvSaleDescription;
}

@Override
public int getCountForHeader(int position) 
{       
    int RetVal = 0;
    try 
    {
        boolean isSaleTemp = getItem(position).isTemporarySale;
        if(isSaleTemp)
        {
            RetVal = App.salesByType.get(headers[0]).size();
        }
        else
        {
            RetVal = App.salesByType.get(headers[1]).size();
        }
    }
    catch (Exception e) {}
    return RetVal;
}

@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) 
{       
    HeaderView holder;
    String currentHeader = headers[position];
    if(convertView == null)
    {
        holder = new HeaderView();
        convertView = LayoutInflater.from(mContext).inflate(R.layout.sales_header_view, null);
        holder.tvHeader = (RobotoTextView)convertView.findViewById(R.id.tv_header_text);

        convertView.setTag(holder);
    }
    else
    {
        holder = (HeaderView)convertView.getTag();
    }

    holder.tvHeader.setText(currentHeader);     

    return convertView;
}

private class HeaderView
{
    private RobotoTextView tvHeader;
}

@Override
public int getNumHeaders() 
{       
    int RetVal = 0;
    try 
    {
        RetVal = App.salesByType.keySet().size();
    }
    catch (Exception e) {}
    return RetVal;
}

}

shalommelamed commented 11 years ago

the problem was in this method:

@Override public int getCountForHeader(int position) {
int RetVal = 0; try { boolean isSaleTemp = getItem(position).isTemporarySale; if(isSaleTemp) { RetVal = App.salesByType.get(headers[0]).size(); } else { RetVal = App.salesByType.get(headers[1]).size(); } } catch (Exception e) {} return RetVal; } what I supposed to do is:

@Override public int getCountForHeader(int position) {
int RetVal = 0; try { RetVal = App.salesByType.get(headers[position]).size() } catch (Exception e) {} return RetVal; }