Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android gridview OnItemClickListener

I successfully created a custom gridview(with images and texts). Now I want to write an OnItemClickListener method.I can get the position on OnItemClickListener method, but I want to be able to click "Friend" and see "Item clicked : Friend"

How can I get the select string instead of the position? Here is my source code

public class Item {
Bitmap image;
String title;

public Item(Bitmap image, String title) {
    super();
    this.image = image;
    this.title = title;
}
public Bitmap getImage() {
    return image;
}
public void setImage(Bitmap image) {
    this.image = image;
}
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}



public class CustomGridViewAdapter extends ArrayAdapter<Item> {
Context context;
int layoutResourceId;
ArrayList<Item> data = new ArrayList<Item>();
public static Item item ;

public CustomGridViewAdapter(Context context, int layoutResourceId,
        ArrayList<Item> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    RecordHolder holder = null;

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new RecordHolder();
        holder.txtTitle = (TextView) row.findViewById(R.id.item_text);
        holder.imageItem = (ImageView) row.findViewById(R.id.item_image);
        row.setTag(holder);
    } else {
        holder = (RecordHolder) row.getTag();
    }

    item= data.get(position);
    holder.txtTitle.setText(item.getTitle());
    holder.imageItem.setImageBitmap(item.getImage());
    return row;

}

public static class RecordHolder {
    public static TextView txtTitle;
    ImageView imageItem;

}

}

public class MainActivity extends Activity {
GridView gridView;
ArrayList<Item> gridArray = new ArrayList<Item>();
CustomGridViewAdapter customGridAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // set grid view item
    Bitmap homeIcon = BitmapFactory.decodeResource(this.getResources(),
            R.drawable.home);
    Bitmap userIcon = BitmapFactory.decodeResource(this.getResources(),
            R.drawable.personal);

    gridArray.add(new Item(homeIcon, "Home"));
    gridArray.add(new Item(userIcon, "User"));
    gridArray.add(new Item(homeIcon, "House"));
    gridArray.add(new Item(userIcon, "Friend"));
    gridArray.add(new Item(homeIcon, "Home"));
    gridArray.add(new Item(userIcon, "Personal"));
    gridArray.add(new Item(homeIcon, "Home"));
    gridArray.add(new Item(userIcon, "User"));
    gridArray.add(new Item(homeIcon, "Building"));
    gridArray.add(new Item(userIcon, "User"));
    gridArray.add(new Item(homeIcon, "Home"));
    gridArray.add(new Item(userIcon, "xyz"));

    gridView = (GridView) findViewById(R.id.gridView1);
    customGridAdapter = new CustomGridViewAdapter(this, R.layout.row_grid,
            gridArray);
    gridView.setAdapter(customGridAdapter);
    gridView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Toast.makeText(getApplicationContext(),
                    "Item Clicked: " + position, Toast.LENGTH_SHORT).show();

        }
    });
}

}

like image 912
user3619713 Avatar asked May 26 '14 16:05

user3619713


People also ask

How to use setonitemclicklistener on grid view?

setOnItemClickListener() method applies on grid view to detect grid view item clicked or not. With the use of this method app developer can easily do particular task on grid view click like open new activity, detect gridview clicked item name and more.

What is listadapter in Android GridView?

Android GridView shows items in two-dimensional scrolling grid (rows & columns) and the grid items are not necessarily predetermined but they automatically inserted to the layout using a ListAdapter. An adapter actually bridges between UI components and the data source that fill data into UI Component.

How to detect grid view item clicked or not?

setOnItemClickListener() method applies on grid view to detect grid view item clicked or not.

What is GridView in Android Studio?

Android GridView shows items in two-dimensional scrolling grid (rows & columns) and the grid items are not necessarily predetermined but they automatically inserted to the layout using a ListAdapter


Video Answer


2 Answers

Change this

Toast.makeText(getApplicationContext(),
                    "Item Clicked: " + position, Toast.LENGTH_SHORT).show();

to

Toast.makeText(getApplicationContext(),
                        "Item Clicked: " + ((TextView) v.findViewById(R.id.item_text)).getText(), Toast.LENGTH_SHORT).show();
like image 141
Giru Bhai Avatar answered Oct 17 '22 06:10

Giru Bhai


I know this answer is coming in a little late but I just ran into the same issue and I solved it by using tags on the clickable items using setTag() and getTag(). I just want to post this method in case it will help someone else in the future. In order to use this method and the view "holding pattern" (like you are using above) you just have to set the tag on another item inside the object that is "holding" your data.

For example:

You already have a public RecordHolder object with a public TextView so you can set the tag on this TextView like so:

holder.txtTitle.setTag("whatever you want")

Then inside your OnItemClickListener.onItemClick method you can get the tag like so:

String tagValue = ((CustomGridViewAdapter.RecordHolder) view.getTag()).txtTitle.getTag().toString();

tagValue will be whatever you want (so you can assign the names of the views if you wish). This method works well if you want to store other data (like ids or references) and not just grab the text of TextView or something like this. If you just want the same text that is in TextView then @Giru's answer is more fitting.

like image 2
Max Worg Avatar answered Oct 17 '22 06:10

Max Worg