3

On home scree of application, how to display the menu which is similar to android menu but no items needs to be displayed in specific cells. Considering grid of 3 x 3, five items only needs to be displayed at (Row, Col): [0,1], [1,0], [1,1], [1,2], [2,1].

We have tried GridView and set visibility to GONE (convertView.setVisibility(View.GONE);) for items which need not be displayed. Following this, item is not displayed in grid but when user browses through blank item using up and down keys or click directly on blank item, that icon is hihglighted and selected as if it is blank item in grid. We want as it is blank it should not repond to user events neither highlighted not selected.

Code for Grid View:

package org.XXX;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class XXXActivity extends Activity {
    GridView MyGrid;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.maingrid);
        MyGrid = (GridView)findViewById(R.id.MyGrid);
        MyGrid.setAdapter(new ImageAdapter(this));


        MyGrid.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
                Toast.makeText(arg0.getContext(), position + " selected", Toast.LENGTH_LONG).show();

                switch(position) {
                case 0:break;
                case 1:
                    //Browse
                    Intent newIntent = new Intent(XXXActivity.this, YYYListItemIcons.class);
                    startActivity(newIntent);
                    break;
                case 2:break;
                case 3:
                    //Saved Searches
                    newIntent = new Intent(XXXActivity.this, ZZZListItemIcons.class);
                    startActivity(newIntent);
                    break;
                case 4:
                    //Sign in
                    break;
                case 5:
                    //Reminders
                    break;
                case 6:break;
                case 7:
                    //Sign up
                    break;
                case 8:break;
                }
            }

        });

        //onSearchRequested(); //to open search by default
    }


    public class ImageAdapter extends BaseAdapter
    {
        Context MyContext;

        public ImageAdapter(Context _MyContext)
        {
            MyContext = _MyContext;
        }

        @Override
        public int getCount()
        {
            return 9;
        }

        public View getView(int position, View convertView, ViewGroup parent) {

            ViewHolder holder;
            LayoutInflater mInflater = LayoutInflater.from(MyContext);

            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.grid_item, null);
                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.grid_item_text);
                holder.icon = (ImageView) convertView.findViewById(R.id.grid_item_image);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            // Bind the data efficiently with the holder.
            holder.text.setText(getTextId(position));
            holder.icon.setImageBitmap(BitmapFactory.decodeResource(MyContext.getResources(), getIconId(position)));
            if(getIconId(position) == R.drawable.nothing) {
                convertView.setVisibility(View.GONE);
            }
            return convertView;
        }

        @Override
        public Object getItem(int arg0) {
            return arg0;
        }

        @Override
        public long getItemId(int arg0) {
            return arg0;
        }

        private int getIconId(int position) {
            int iconImages[] = {
                    R.drawable.nothing,
                    R.drawable.browse,
                    R.drawable.nothing,
                    R.drawable.saved_searches,
                    R.drawable.sign_in,
                    R.drawable.reminders,
                    R.drawable.nothing,
                    R.drawable.sign_up,
                    R.drawable.nothing
            };
            return iconImages[position];
        }

        private int getTextId(int position) {
            int iconNames[] = {
                    R.string.nothing,
                    R.string.browse,
                    R.string.nothing,
                    R.string.saved_searches,
                    R.string.sign_in,
                    R.string.reminders,
                    R.string.nothing,
                    R.string.sign_up,
                    R.string.nothing
            };
            return iconNames[position];
        }

    }

    static class ViewHolder {
        TextView text;
        ImageView icon;
    }

}

GridLayout:

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/MyGrid"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center"
    android:padding="5dp"
    android:verticalSpacing="5dp"
    android:horizontalSpacing="20dp"
    android:numColumns="auto_fit"
    android:columnWidth="60dp"
    android:stretchMode="columnWidth"
    android:gravity="center">
</GridView>            

PerItemIconLayout in Grid:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/GridItem"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="vertical"
   android:gravity="center_horizontal">

   <ImageView android:id="@+id/grid_item_image"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content">
   </ImageView>

   <TextView android:id="@+id/grid_item_text"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="TextView"
      android:gravity="center_horizontal"
      android:textColor="#FFFFFF">
   </TextView>

</LinearLayout>
Stauz
  • 316
  • 3
  • 12

2 Answers2

1
if(getIconId(position) == R.drawable.nothing) {
convertView.setVisibility(View.GONE);
}

replace the above lines by below and try....

if(getIconId(position) == R.drawable.nothing) {
   convertView.setVisibility(View.GONE);
   convertView.setClickable(false);
   convertView.setEnabled(false);
}

try this code in getview().

Shankar Agarwal
  • 34,573
  • 7
  • 66
  • 64
0

Now that you have posted your code, I am not sure if you can technically remove but you can disable the "highlighted" click that you are talking about, this way, when a user clicks on the one of the icons, it will no longer highlight.

This can be done via XML or in your code:

https://stackoverflow.com/questions/2865683/android-disable-highlighting-in-gridview

Code: GridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
XML: android:listSelector="#00000000"

However, this will affect all the icons in your gridview.

Also take a look at this:

https://stackoverflow.com/questions/5514629/how-to-disable-item-click-for-particular-positions-in-grid-view-in-android

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Jared Burrows
  • 54,294
  • 25
  • 151
  • 185
  • If we set list selector then even required items won't be highlighted. So, this approach cannot be followed. – Stauz Apr 05 '12 at 05:13
  • Also, disable item has not impact user can still select the item in list and this is causing highlight of the item – Stauz Apr 05 '12 at 05:14