Search code examples
javaandroidgridviewonclicklistener

App is crashed after adding switch case in gridview


I got the problem when I tried to add switch case in custom page adapter. I can toast if one item of gridview is clicked. But when I tried to add new activity with onClick, app is crashed. I want to show new activity if gridview item is clicked. I've searched and studied regarding this problem, but I can't find solution.I think my problem is related to switch case. I am learning android. Please help me.

CustomAdapter.java

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class CustomAdapter extends BaseAdapter{

    String [] result;
    Context context;
    int [] imageId;
    private static LayoutInflater inflater=null;
    public CustomAdapter(MainActivity mainActivity, String[] osNameList, int[] osImages) {
        // TODO Auto-generated constructor stub
        result=osNameList;
        context=mainActivity;
        imageId=osImages;
        inflater = ( LayoutInflater )context.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return result.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public class Holder
    {
        TextView os_text;
        ImageView os_img;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Holder holder=new Holder();
        View rowView;

        rowView = inflater.inflate(R.layout.sample_gridlayout, null);
        holder.os_text =(TextView) rowView.findViewById(R.id.os_texts);
        holder.os_img =(ImageView) rowView.findViewById(R.id.os_images);

        holder.os_text.setText(result[position]);
        holder.os_img.setImageResource(imageId[position]);

        rowView.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                switch(position){
                    case 0:
                        Intent a = new Intent(v.getContext(), FirstActivity.class);
                        v.getContext().startActivity(a);
                        break;
                    case 1:
                        Intent b = new Intent(v.getContext(), DefaultActivity.class);
                        v.getContext().startActivity(b);
                        break;

                }


            }        });

        return rowView;
    }



}

MainActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView;

public class MainActivity extends Activity {

    GridView gridview;

    public static String[] osNameList = {
            "Android",
            "iOS",
            "Linux",
    };
    public static int[] osImages = {
            R.drawable.alpha,
            R.drawable.beta,
            R.drawable.cupcake,
};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gridview = (GridView) findViewById(R.id.customgrid);
        gridview.setAdapter(new CustomAdapter(this, osNameList, osImages));
    }
}

Solution

  • This is not the way to set OnItemClick Listener. If you want to set click on whole item you should use OnItemClickListener. Remove the OnClickListener from getView() and use OnItemClickListener as follows.

     GridView gridview = (GridView) findViewById(R.id.customgrid);
        gridview.setAdapter(new CustomAdapter(this, osNameList, osImages));
        gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                switch(position){
                    case 0:
                        Intent a = new Intent(v.getContext(), FirstActivity.class);
                        startActivity(a);
                        break;
                    case 1:
                        Intent b = new Intent(v.getContext(), DefaultActivity.class);
                        startActivity(b);
                        break;
                    default:
                        break;
                }
    
            } });
    

    NOTE:- There is no need of switch inside OnClickListener which is inside getView() because its only going to call for one position at a time.