Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OnClickListener not working for first item in GridView

Tags:

I have a problem with creating a GridView-based calendar. Here is the Grid:

GridView Calendar

This is supposed to be a calendar populated with events, so I have my adapter implement OnClickListener and I set that listener for every button in the calendar. It works perfectly for every single button EXCEPT the first one(in this case number 30). When I click it just doesn't work, but when I click on another button after I have attempted to click on the first one, it performs the click for the first one just before performing the click for the other button.

I've scanned about 10 pages of relevant questions and have not found someone to have this problem. Help please!

As asked, here is the getView function of my code:

    public View getView(int position, View convertView, ViewGroup parent)     {         View row = convertView;         ViewHolder holder;         if (row == null)         {             holder = new ViewHolder();             LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);             row = inflater.inflate(R.layout.calendar_day_gridcell, parent, false);             holder.gridCell = (Button) row.findViewById(R.id.calendar_day_gridcell);             holder.multiDayEvent = (EventLengthView)row.findViewById(R.id.eventLengthView);         }         else{             holder = (ViewHolder)row.getTag();         }          int calendarGridHeight = (calendarView.getHeight()-5)/(getCount()/7);         AbsListView.LayoutParams params = new AbsListView.LayoutParams(                 android.view.ViewGroup.LayoutParams.FILL_PARENT,                 calendarGridHeight);         row.setLayoutParams(params);          //Change the background drawable depending on the position in the calendar         if ((position+1) % 7 == 0){             holder.gridCell.setBackgroundDrawable(getResources().getDrawable(R.drawable.calendar_button_selector_end_row));         }         if (getCount() - position < 8){             holder.gridCell.setBackgroundDrawable(getResources().getDrawable(R.drawable.calendar_button_selector_end_column));         }         if (position == getCount()-1){             holder.gridCell.setBackgroundDrawable(getResources().getDrawable(R.drawable.calendar_button_selector_end));         }         holder.gridCell.setOnClickListener(this);          holder.gridCell.setTag(null);//clear tags          // ACCOUNT FOR SPACING         String[] day_color = list.get(position).split("-");         int theday = Integer.parseInt(day_color[0]);         int themonth = Integer.parseInt(day_color[2]);         int theyear = Integer.parseInt(day_color[3]);         String date = DateFormat.format("dd/M/yy", new Date(theyear,themonth,theday)).toString();         if ((!eventsMap.isEmpty()) && (eventsMap != null))         {             if (eventsMap.containsKey(date))             {                 holder.multiDayEvent.SetMeasure(calendarView.getWidth()/7, calendarGridHeight);                  holder.multiDayEvent.setVisibility(View.VISIBLE);                 //holder.singleDayEvent.setVisibility(View.VISIBLE);                 Event event = (Event) eventsMap.get(date);                 holder.multiDayEvent.AddEvent(event);                 holder.gridCell.setTag(event);             }             else{                 //holder.singleDayEvent.setVisibility(View.GONE);                 holder.multiDayEvent.setVisibility(View.GONE);             }         }          // Set the Day GridCell         holder.gridCell.setText(Integer.toString(theday));          if (day_color[1].equals("GREY"))         {             holder.gridCell.setTextColor(Color.GRAY);         }         if (day_color[1].equals("WHITE"))         {             holder.gridCell.setTextColor(Color.WHITE);         }         if (day_color[1].equals("BLUE"))         {             holder.gridCell.setTextColor(Color.BLUE);         }          row.setTag(holder);         return row;     }      public class ViewHolder{         Button gridCell;         ImageView singleDayEvent;         EventLengthView multiDayEvent;     }      public void onClick(View view)     {         if (view.getTag() != null){             Event event = (Event)view.getTag();              eventListView.setAdapter(new EventListAdapter(CalendarScreen.this, event));             eventListViewLayout.setVisibility(View.VISIBLE);             eventListViewLayout.startAnimation(fadeIn);         }         else if (eventListViewLayout.getVisibility() == View.VISIBLE){             onBackPressed();         }     } 

The onClick gets called for every gridcell EXCEPT the first one in the top left corner

like image 250
Valentin Avatar asked Aug 02 '12 13:08

Valentin


2 Answers

Use your OnClickListener() in your activity after .setAdapter() method, not in your adapter class.

gridView.setAdapter(adapter); gridView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) {     Toast.makeText(GridViewActivity.this, "" + position,              Toast.LENGTH_SHORT).show();     } }); 
like image 42
Rashid Avatar answered Oct 11 '22 07:10

Rashid


I had the same problem.Keeping the setLayoutParams inside the if(view == null) clause worked out. You dont have to sacrifice view recyling in that way.

like :

 if(row == null){    // inflate row    row.setLayoutParams(params);    //remaining code  }else{     holder = (ViewHolder)row.getTag();  }  // everything else 

I don't know why it works but it worked for me. I also noticed that all codes regarding the same issue in stackoverflow had also used setLayoutParams outside the if clause. This is my first time so i dont know if i can post this everywhere. Hope it helped .

Source : Lot of trail and error .

like image 134
BruceWayne Avatar answered Oct 11 '22 07:10

BruceWayne