Nayra Ahmed
Nayra Ahmed

Reputation: 655

Application crashes while scrolling my custom gridView

enter image description here

I want my grid view to be like the grid view in the picture, so that the cells in the most right column are only buttons and the rest cells contain Imageview and textview

This is my custom adapter

public class AllCategoriesAdapter extends ArrayAdapter<Recipe>{

private ArrayList<Recipe> RecipesInfo;
private Context con;
private ImageLoader imageLoader;

public AllCategoriesAdapter(Context context, int resource, ArrayList<Recipe> objects) {
    super(context, resource, objects);
    // TODO Auto-generated constructor stub
    RecipesInfo         = objects;
    con                 = context;
    imageLoader         = new ImageLoader(context);
}

public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    RecipeItemHolder recipeHolder;
    View view ;


    recipeHolder = new RecipeItemHolder(); 
    int type     = getItemViewType(position);
    if (convertView == null ) 
    {
        LayoutInflater inflater = ((Activity) con).getLayoutInflater();
        if ( type == 3 )
        {
            view                = inflater.inflate(R.layout.category_button_row, parent , false);

        }
        else
        {
            view                = inflater.inflate(R.layout.all_recipe_list_row, parent, false);

        }
        view.setTag(recipeHolder);
    }
    else
    {
        view = convertView;
        recipeHolder = (RecipeItemHolder) view.getTag();
    }

    Recipe rItem = (Recipe) this.RecipesInfo.get(position);

    if (  type == 3 )
    {
        recipeHolder.button = (Button) view.findViewById(R.id.btCategoryButton);
        recipeHolder.button.setText(rItem.getCategoryName());
    }
    else
    {
        recipeHolder.RecipeTxt1 = (TextView) view.findViewById(R.id.tvRecipeCell);
        recipeHolder.img        = (ImageView) view.findViewById(R.id.imgRecipeInCategory);
        recipeHolder.RecipeTxt1.setText(rItem.getName());
        /*Bitmap b = BitmapFactory.decodeResource(con.getResources(), R.drawable.ic_launcher);
        Drawable top = new BitmapDrawable(con.getResources(),b);
        recipeHolder.RecipeTxt1.setCompoundDrawablesWithIntrinsicBounds(null, top, null, null);*/
        imageLoader.DisplayImage(String.valueOf(rItem.getImageId()), recipeHolder.img);
    }


    return view;
}



public void notifyDataSetChanged() {
    // TODO Auto-generated method stub
    super.notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
    // TODO Auto-generated method stub
    return (position%4);
}
@Override
public int getViewTypeCount() {
    // TODO Auto-generated method stub
    return 2;
}
public void setArray (ArrayList<Recipe> obj)
{
    RecipesInfo = obj;
}

private static class RecipeItemHolder {
    TextView RecipeTxt1;
    Button   button;
    ImageView img;
}

}

but the view crashes when scrolling

11-30 13:19:07.030: E/AndroidRuntime(9593): FATAL EXCEPTION: main
11-30 13:19:07.030: E/AndroidRuntime(9593): java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
11-30 13:19:07.030: E/AndroidRuntime(9593):     at    android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:6355)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4883)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3087)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:3361)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.View.dispatchTouchEvent(View.java:7246)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.app.Activity.dispatchTouchEvent(Activity.java:2410)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.View.dispatchPointerEvent(View.java:7426)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4342)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4382)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.Choreographer.doFrame(Choreographer.java:530)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.os.Handler.handleCallback(Handler.java:725)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.os.Looper.loop(Looper.java:137)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at android.app.ActivityThread.main(ActivityThread.java:5041)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at java.lang.reflect.Method.invokeNative(Native Method)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at java.lang.reflect.Method.invoke(Method.java:511)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-30 13:19:07.030: E/AndroidRuntime(9593):     at dalvik.system.NativeStart.main(Native Method)
11-30 13:19:11.040: E/Trace(9624): error opening trace file: No such file or directory (2)

Upvotes: 0

Views: 727

Answers (1)

Human
Human

Reputation: 10815

You need to add getCount() to your adapter

@Override
public int getCount() {
    return RecipesInfo.size();
}
enter code here

EDIT :

You don't need to use getItemViewType et getViewTypeCount because you return the view based in the type = getItemViewType(position);

Upvotes: 1

Related Questions