Search code examples
androideclipsegridviewonitemclicklistenerclickable

Android Eclipse: GridView Items not clickable?


I implemented a gridview where an array of "products" are populated along with another array of "product images" are populated to make up a grid view list of products in a Sqlite database. However, when I set up a OnItemClickListener, the gridview items are not clickable when I run the app on my device. It's simply able to scroll down through the products and images but not clickable.

The application works well and the image gets displayed along with the product details BUT each grid item is not clickable. Why does this happen folks?

Here's my codes:

MainActivity Class

gridView = (GridView)findViewById(R.id.grid);
            ProductGridInflator bA = new ProductGridInflator(this, R.layout.home ,dbProducts, dbImages);
            gridView.setAdapter(bA);

            gridView.setOnItemClickListener(new OnItemClickListener() {


                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {

                    Product currentProduct = new Product();

                    String product_name=null;

                    for(int i=0;i<dbProducts.size();i++)
                    {
                        product_name = dbProducts.get(i).NAME;
                    }

             //Sharing product details with all windows
                    SharedPreferences pref = getApplicationContext().getSharedPreferences("AppProduct", 0); // 0 - for private mode
                    Editor editor = pref.edit();
                    editor.putString("pname", product_name);
                    editor.commit();

                    Intent inn1=getIntent();
                    inn1=new Intent(HomeActivity.this, ProductSingle_Activity.class);
                    startActivity(inn1);

                }
            });

XML of a single grid item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/feed_bg"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="@dimen/feed_item_margin"
        android:layout_marginRight="@dimen/feed_item_margin"
        android:layout_marginTop="@dimen/feed_item_margin"
        android:background="@drawable/bg_parent_rounded_corner"
        android:orientation="vertical"
        android:paddingBottom="@dimen/feed_item_padding_top_bottom"
        android:paddingTop="@dimen/feed_item_padding_top_bottom" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingLeft="@dimen/feed_item_padding_left_right"
            android:paddingRight="@dimen/feed_item_padding_left_right" >

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingLeft="@dimen/feed_item_profile_info_padd" >

                <TextView
                    android:id="@+id/grid_text"
                    android:layout_width="285dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="15dp"
                    android:textSize="18sp" />

                <TextView
                    android:id="@+id/more_details"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="02:12pm"
                    android:textColor="@color/timestamp"
                    android:textSize="@dimen/feed_item_timestamp" />

                <TextView
                    android:id="@+id/grid_desc"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="15dp"
                    android:textColor="@color/timestamp"
                    android:textSize="15sp" />
            </LinearLayout>
        </LinearLayout>

        <HorizontalScrollView
            android:id="@+id/slider"
            android:layout_width="match_parent"
            android:layout_height="282dp"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_weight="0.55" >

            <ImageView
                android:id="@+id/grid_image"
                android:layout_width="285dp"
                android:layout_height="285dp" />
        </HorizontalScrollView>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingLeft="@dimen/feed_item_padding_left_right"
            android:paddingRight="@dimen/feed_item_padding_left_right" >

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingLeft="@dimen/feed_item_profile_info_padd" >

                <TextView
                    android:id="@+id/interaction_text"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="Likes: 34 Comments: 45"
                    android:textColor="@color/timestamp"
                    android:textSize="@dimen/feed_item_timestamp"/>

            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

Gridview Adapter

public class ProductGridInflator extends ArrayAdapter<Product>{
    private int[] Imageid; // this is the image id you are using... this is not initiatiliehs
    ArrayList<Product> dbProducts; // your person arraylist
    Context ctx; // the activity context
    int resource; // this will be your xml file
    ArrayList<Image> urlArr = new ArrayList<Image>();
    ArrayList<Image> dbImages = new ArrayList<Image>();

    public ProductGridInflator(Context context, int resource,ArrayList<Product> objects, ArrayList<Image> obj) {
        super(context, resource, objects);
        // TODO Auto-generated constructor stub
        this.dbProducts = objects;
        this.ctx = context;
        this.resource = resource;
        this.dbImages = obj;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        if(dbProducts.size() == 0){
            return 0;
        }else{
            return dbProducts.size();
        }
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View child = convertView;
        RecordHolder holder;
        LayoutInflater inflater = ((Activity) ctx).getLayoutInflater(); // inflating your xml layout


        if (child == null) {            
            child = inflater.inflate(R.layout.grid_single, parent, false);
            holder = new RecordHolder();
            holder.productName = (TextView) child.findViewById(R.id.grid_text); // fname is the reference to a textview
            //holder.productImage = (TextView) child.findViewById(R.id.txtLname); // in your xml layout file 
            //holder.bio =(TextView) child.findViewById(R.id.txtBio); // you are inflating.etc
            holder.image = (ImageView) child.findViewById(R.id.grid_image);
            holder.productDesc = (TextView) child.findViewById(R.id.grid_desc);
            holder.moreDetails = (TextView) child.findViewById(R.id.more_details);
            child.setTag(holder);
        }else{
            holder = (RecordHolder) child.getTag();
        }

        final Product user = dbProducts.get(position); // you can remove the final modifieer.

        holder.productName.setText(user.getNAME());      
        //holder.lname.setText(user.getLName());
        //holder.bio.setText(user.getBiography());


        HorizontalScrollView scroller = (HorizontalScrollView) child.findViewById(R.id.slider);
        for(int i=0;i<dbImages.size();i++)
        {
            if(dbImages.get(i).PID.equals(user.PID))
            {
                //Picasso.with(ctx).load(dbImages.get(i).URL).into(holder.image);
                Picasso.with(ctx)
                  .load(dbImages.get(i).URL)
                  .placeholder(R.drawable.loading_placeholder)
                  .error(R.drawable.error_placeholder)
                  .into(holder.image);
            }
            else
                continue;
        }

        holder.productDesc.setText(user.DESC);
        holder.moreDetails.setText(user.CATEGORY + " - " + "Rating: " + user.RATING + " - " + "Sizes: " + user.SIZE);

        // the string as url and set it to your imageview..
        return child;
    }

    static class RecordHolder {
        TextView productName;
        ImageView image;   
        TextView productDesc;
        TextView moreDetails;
    }

    @Override
    public void notifyDataSetChanged() { // you can remove this..
        // TODO Auto-generated method stub      
        if(getCount() == 0){
            //show layout or something that notifies that no list is in..
        }else{
            // this is to make sure that you can call notifyDataSetChanged in any place and any thread
            new Handler(getContext().getMainLooper()).post(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    ProductGridInflator.super.notifyDataSetChanged();
                }
            });
        }
    }
}

Main GridView XML (Window where the GridView is located):

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="activity.classes.HomeActivity" >

    <RelativeLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8pt"
            android:gravity="center_horizontal"
            android:text="Jezza"
            android:textSize="25dip" />

        <TextView
            android:id="@+id/hub_error"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="2dip"
            android:textColor="#e30000"
            android:textStyle="bold" />

        <GridView
            android:id="@+id/grid"
            android:layout_width="fill_parent"
            android:layout_height="395dp"
            android:layout_alignParentBottom="true"
            android:columnWidth="100dp"
            android:gravity="center"
            android:numColumns="1"
            android:stretchMode="columnWidth"
            android:verticalSpacing="10dp" />
    </RelativeLayout>

    <ListView
        android:id="@+id/drawerList"
        android:background="#EEEEEE"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@null"
        android:dividerHeight="0dp" />

</android.support.v4.widget.DrawerLayout>

THANK YOU!


Solution

  • Try adding contents to another layout and inflate that layout to grid view like this.

    public View getView(int position, View convertView, ViewGroup parent) {
    
                         View grid = convertView;
                         if (convertView == null) {
    
                         grid = inflater.inflate(R.layout.gridview_layout, parent, false);
                         } else {
                         grid = (View) convertView;
              }
    
            final Button bt = (Button) grid.findViewById(R.id.ready);
            final TextView tno=(TextView)grid.findViewById(R.id.txt);
            final TextView name=(TextView)grid.findViewById(R.id.txt3);
            final TextView qty=(TextView)grid.findViewById(R.id.txt4);
            final TextView instr=(TextView)grid.findViewById(R.id.txt5); 
    
            dish = data.get(position);
    
            tno.setText(dish.get(KEY_TNO));
            name.setText("NAME: "+dish.get(KEY_NAME));
            qty.setText("QTY:"+dish.get(KEY_QUANTITY));
            instr.setText("INSTRN: "+dish.get(KEY_INSTRUCTION));
    
    
            bt.setOnClickListener(new View.OnClickListener() {  
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
    
                    String tn = tno.getText().toString();
                    System.out.println("TABLE NO:"+tn);
                    Toast.makeText(getApplicationContext(), "Successssss"+tn,    Toast.LENGTH_SHORT).show();
    
    
                }
            });
    
            return grid;
        }