studio - propiedades gridview android
OnClickListener no funciona para el primer elemento en GridView (7)
Establezca onItemClickListener en el objeto GridView en lugar de configurar onClickListeners en cada botón.
Y encontré otra pregunta con tu problema here . Recompensa tal vez?
Tengo un problema con la creación de un calendario basado en GridView. Aquí está la cuadrícula:
Se supone que este es un calendario lleno de eventos, por lo que mi adaptador implementa OnClickListener y configuro esa escucha para cada botón en el calendario. Funciona perfectamente con cada botón, EXCEPTO el primero (en este caso, el número 30). Cuando hago clic, simplemente no funciona, pero cuando hago clic en otro botón después de haber intentado hacer clic en el primero, hace clic para el primero justo antes de hacer clic para el otro botón.
He escaneado alrededor de 10 páginas de preguntas relevantes y no he encontrado a nadie que tenga este problema. ¡Ayuda por favor!
Según lo solicitado, aquí está la función getView de mi código:
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();
}
}
El onClick es llamado para cada celda, excepto la primera en la esquina superior izquierda
Ok, he encontrado la solución. El problema era estas líneas:
ViewHolder holder;
if (convertView == null)
{
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.calendar_day_gridcell, parent, false);
holder.gridCell = (Button) convertView.findViewById(R.id.calendar_day_gridcell_button);
holder.multiDayEvent = (EventLengthView) convertView.findViewById(R.id.eventLengthView);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
Al colocar el botón de celda de celdas allí, de alguna manera, se mezcla el oyente de clic de la primera posición en el adaptador. Terminé reparándolo simplemente instatando al titular en cada pase, en lugar de obtenerlo por etiqueta (lo que es mejor para el rendimiento, pero bueno). Gracias a todos por la ayuda.
Por favor, consulte este link , se ha establecido el color de fondo de la vista de cuadrícula en TRANSPARENTE. Te puede ayudar.
Por lo que vale, también tuve este problema (la primera celda de la vista de cuadrícula se retrasó en un clic).
En mi caso, estaba usando una vista de cuadrícula (ligeramente personalizada) con conjuntos dinámicos de vistas de imagen que haría visible / desaparecido y volvería a dibujar la vista de cuadrícula. Todas las vistas de imagen se prepararon de antemano y se almacenaron en el adaptador.
Inicialmente, usé notifyDataSetChanged () en el adaptador, pero esto resultó en un problema de clics demorados para la primera celda cada vez que se actualizaba el conjunto. Cambié a solo invalidar el gridview y ahora las cosas están bien. Tenga en cuenta que todas mis vistas ya están creadas y almacenadas en el adaptador, es solo el método getview que comprueba cuáles son realmente visibles.
Tuve el mismo problema. El evento de clic en el primer elemento se retrasó significativamente. Ya estaba utilizando notifyDataSetInvalidated (). El uso de onItemClickListener () solucionó el problema , aunque todavía no entiendo por qué el oyente onClick en los elementos individuales tiene este comportamiento.
Tuve el mismo problema. Mantener el setLayoutParams dentro de la cláusula if (ver == nulo) funcionó. No tienes que sacrificar la vista recyling de esa manera.
me gusta :
if(row == null){
// inflate row
row.setLayoutParams(params);
//remaining code
}else{
holder = (ViewHolder)row.getTag();
}
// everything else
No sé por qué funciona, pero funcionó para mí. También noté que todos los códigos relacionados con el mismo problema en también usaron setLayoutParams fuera de la cláusula if. Esta es mi primera vez, así que no sé si puedo publicar esto en todas partes. Espero que haya ayudado.
Fuente: Mucho rastro y error.
Use su OnClickListener () en su actividad después del método .setAdapter () , no en su clase de adaptador.
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();
}
});