OnClickListener pas de travail pour le premier élément dans le contrôle GridView
J'ai un problème avec la création d'un GridView calendrier. Voici la Grille:
C'est censé être un calendrier rempli avec les événements, donc, j'ai ma carte en œuvre OnClickListener et j'ai mis que l'auditeur pour chaque bouton dans le calendrier. Il fonctionne parfaitement pour tous les boutons SAUF le premier(dans ce cas, le numéro 30). Quand je clique ça ne marche pas, mais quand je clique sur un autre bouton après j'ai essayé de cliquer sur le premier, il effectue le clic pour le premier, juste avant d'effectuer le clic pour le bouton autre.
J'ai scanné environ 10 pages de questions et n'ont pas trouvé quelqu'un à eu ce problème. De l'aide s'il vous plaît!
Comme demandé, voici le getView fonction de mon 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();
}
}
Le onClick est appelée pour chaque gridcell l'EXCEPTION de la première dans le coin supérieur gauche
- Merci de mettre le code que vous avez Utilisé..
- Pourquoi n'essayez-vous pas cet exemple
- mon code est basé sur cet exemple
Vous devez vous connecter pour publier un commentaire.
Ok, j'ai trouvé la solution. Le problème était de ces lignes:
Lors de la mise instatiating la gridCell bouton de là, en quelque sorte, il mixe jusqu'à l'écouteur de clics de la première position dans la carte. J'ai fini de fixation seulement par instatiating le titulaire à chaque passage, au lieu de se faire par tag (ce qui est mieux pour la performance, mais bon). Merci à tous pour l'aide.
J'ai eu le même problème.En gardant le setLayoutParams à l'intérieur de la si(vue == null) l'alinéa a fonctionné. Vous n'avez pas à sacrifier la vue sur le recyclage de cette façon.
comme :
Je ne sais pas pourquoi cela fonctionne, mais il a travaillé pour moi. J'ai aussi remarqué que tous les codes à propos du même problème dans stackoverflow avait également utilisé setLayoutParams à l'extérieur de la clause if. C'est ma première fois donc je ne sais pas si je peux poster partout. Espérons qu'il a aidé .
Source : Beaucoup de sentiers et de l'erreur .
Utiliser votre OnClickListener() dans votre activité après .setAdapter() méthode, pas dans votre classe d'adaptateur.
Pour ce que ça vaut, j'ai eu aussi ce problème (première cellule dans le contrôle gridview avoir retardé onclick).
Dans mon cas, j'ai été en utilisant un (légèrement personnalisé) gridviews avec des ensembles dynamiques de imageviews que je voudrais rendre visible/disparu et redessiner le contrôle gridview. Tous les imageviews où préparé à l'avance et stockés dans la carte.
D'abord, j'ai utilisé notifyDataSetChanged() sur l'adaptateur, mais ce qui a entraîné le retard sur le problème de la première cellule à chaque fois que le jeu a été mis à jour. J'ai changé juste le fait d'invalider le gridview et maintenant les choses sont très bien. Gardez à l'esprit que tous mes points de vue sont déjà créés et stockés dans la carte, c'est juste la méthode getview que les vérifications sont vraiment visibles.
J'ai eu ce même problème. L'événement de clic sur le premier élément a été considérablement retardée. J'étais déjà à l'aide de notifyDataSetInvalidated(). À l'aide de onItemClickListener() a résolu le problème, même si je ne comprends toujours pas pourquoi le onClick auditeur sur les éléments individuels a ce comportement.
Ensemble onItemClickListener sur le contrôle GridView objet au lieu de onClickListeners sur chaque bouton.
Et j'ai trouvé une autre question avec votre problème ici. Bounty peut-être?
Veuillez consulter cette lien, il a mis en gridview couleur d'arrière-plan TRANSPARENT. Il peut vous aider.
Après avoir passé tant de jours, de définir la mise en page params comme suit..
il fonctionne très bien pour moi