A continuación se muestra un fragmento de código con ListView. Agregué una vista vacía y una vista de encabezado. Agregar headerView hace que la posición en onItemClick aumente en uno.
Entonces, sin el headerView el primer elemento de la lista tendría la posición 0, con el headerView la posición del primer elemento de la lista sería 1.
Esto causa errores en mi adaptador, por ejemplo, al llamar a getItem () y usar algunos otros métodos, ver más abajo. Cosa extraña: en el método getView () del adaptador, el primer elemento de la lista se solicita con la posición 0 incluso si se agrega headerView.
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ListView list = (ListView) viewSwitcher.findViewById(R.id.list);
View emptyView = viewSwitcher.findViewById(R.id.empty);
list.setEmptyView(emptyView);
View sectionHeading = inflater.inflate(R.layout.heading, list, false);
TextView sectionHeadingTextView = (TextView) sectionHeading.findViewById(R.id.headingText);
sectionHeadingTextView.setText(headerText);
list.addHeaderView(sectionHeading);
list.setAdapter(listAdapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listAdapter.getItem(position);
//Do something with it
}
});
}
Algunos métodos de adaptador:
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
@Override
public int getItemViewType(int position) {
return (position < items.size()) ? ITEM_NORMAL : ITEM_ADVANCED;
}
@Override
public Product getItem(int position) {
return items.get(position);
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return (position < items.size());
}
¿Es este el comportamiento normal al agregar un headerView? ¿Y cómo solucionar los problemas de mi adaptador?
android
listview
listadapter
d1rk
fuente
fuente
Respuestas:
Me acabo de encontrar con este problema y la mejor manera parece usar el en
ListView.getItemAtPosition(position)
lugar deListAdapter.getItem(position)
como laListView
versión da cuenta de los encabezados, es decir: -Haz esto en su lugar:
fuente
onItemClick
te daparent
una razón. Puede usarparent.getItemAtPosition(position)
AdapterView
también pasa al listAdapter agregado.return (adapter == null || position < 0) ? null : adapter.getItem(position);
Si no le importa el clic en el encabezado, reste el número de vistas del encabezado de la posición para obtener la posición de su adaptador:
fuente
Si agrega un encabezado a,
ListView
ese se convierte en el primer elemento de la lista. Puede compensar esto anulando elgetCount()
para devolver un artículo menos, pero asegúrese de manejar elgetItem()
,getItemId()
y así sucesivamente, ya que el encabezado sería el artículo en la posición 0.fuente
ListView.getHeaderViewsCount()
Al implementar
AdapterView.OnItemClickListener
, simplemente restamos los encabezados de la posición.fuente
No es necesario cambiar ningún código. Simplemente use el siguiente código.
fuente
No use su adaptador, use el adaptador 'decorado' de getAdapter.
fuente
Una solución a esto es mapear el id al index. Básicamente, haga que la identificación devuelva el índice en la lista y el oyente de clics lo haría:
fuente
Hola, podemos resolver esto de esta manera, primero crea su vista de encabezado, después de inyectar en su lista y el último paso no puede establecer el setOnClickListener. funciona para mí. cualquier comentario bienvenido
fuente
No para agregar muchas cosas nuevas que @Ramesh no agregó, pero algo de contexto adicional:
fuente
Use getSelectedItemPosition () Devuelve la posición del elemento seleccionado actualmente dentro del conjunto de datos del adaptador. Este método no necesita preocuparse por el tamaño de los encabezados o pies de página.
fuente
Esto podría ayudar a alguien, mejorando la respuesta de Farid_z y Philipp, podemos aplicar correctamente setItemChecked y setTitle con algo como esto
fuente