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!
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;
}