setonitemclicklistener - recyclerview android
Android AdapterView? (5)
Documents dicen:
Cuando el contenido para su diseño es dinámico o no está predeterminado, puede usar un diseño que subclasifica AdapterView para poblar el diseño con vistas en tiempo de ejecución. Una subclase de la clase AdapterView utiliza un adaptador para vincular datos a su diseño.
Pero la mayoría de los tutoriales están relacionados con ListView
, GridView
, Spinner
y Gallery
.
Estoy buscando extender una subclase directamente desde AdapterView
. Tengo que crear una vista personalizada de que su contenido depende de un adaptador.
¿Cómo puedo hacer esto y qué métodos deben ser anulados?
Derivar desde AdapterView
puede funcionar, pero puede no ser tan beneficioso como esperas. Parte de la infraestructura proporcionada por AdapterView
es de paquete privado, lo que significa que no tenemos acceso a ella.
Por ejemplo, AdapterView
administra el índice del elemento seleccionado para AbsListView
y ListView
. Sin embargo, dado que los métodos como setNextSelectedPositionInt(int position)
(que es la única ruta para establecer mNextSelectedPosition
) son paquetes privados, no podemos acceder a ellos. AbsListView
y ListView
pueden acceder a ellos porque están en el mismo paquete, pero no podemos.
(Si profundiza en el origen de AdapterView
encontrará que setNextSelectedPositionInt()
se llama desde handleDataChanged()
. Desafortunadamente handleDataChanged()
también es package-private y no se _not_called
desde ningún otro lugar dentro de AdapterView
que pueda aprovecharse para habilitar la posición de configuración.
Eso significa que si necesita administrar la posición seleccionada, necesitará recrear esa infraestructura en su clase derivada (o deberá derivar de ListView
o AbsListView
... aunque sospecho que se encontrará con problemas similares derivados de AbsListView
). También significa que cualquier funcionalidad de AdapterView
que gira en torno a la selección de elementos probablemente no será completamente operativa.
Podrías crear algo como esto:
public class SampleAdapter extends BaseAdapter {
public SampleAdapter() {
// Some constructor
}
public int getCount() {
return count; // Could also be a constant. This indicates the # of times the getView gets invoked.
}
public Object getItem(int position) {
return position; // Returns the position of the current item in the iteration
}
public long getItemId(int position) {
return GridView.INVALID_ROW_ID;
}
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.some_layout, null);
view.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
view.setBackgroungColor(Color.RED);
return view;
}
}
Y esto podría invocarse como:
GridView sampleView = (GridView) linearLayout.findViewById(R.id.sample_layout);
sampleView.setAdapter(new SampleAdapter());
Primero, debe estar absolutamente seguro de que AdapterView
es lo que desea, porque no todas las vistas "dinámicas o no predeterminadas" se pueden implementar a través de AdapterView
. A veces es mejor que crees tu vista ampliando ViewGroup
.
si desea usar AdapterView
, eche un vistazo a este ejemplo realmente agradable . Hay muchas vistas personalizadas con adaptador en GitHub. Mira esto (extiende ViewGroup
) .
Puede que esta no sea una respuesta completa a su pregunta, pero le mostraré muy probablemente un punto de inicio o un puntero que puede guiarlo:
ListView
extiende AbsListView
que a su vez extiende AdapterView<ListAdapter>
. Entonces, si absolutamente debe implementar una vista personalizada desde cero, podría echarle un vistazo al código fuente de esas clases:
Pero ten cuidado, esa es toda una tarea. Tal vez sea suficiente usar una de las clases existentes y modificar el aspecto.