Método estático requerido para el adaptador personalizado de ListView
-
27-10-2019 - |
Pregunta
Tengo una clase de objeto primordial (guía) con una subclase (sesión).
public class Guide
private class Session
...
ArrayList<Session> sessions;
public ArrayList<Session> getSessionsByTrack(int n) {
ArrayList<Session> tracks = new ArrayList<Session>();
for (Session session : this.sessions) {
if (session.track == n) {
tracks.add(session);
}
}
Collections.sort(tracks); // sort by start and end time.
return tracks;
}
Tengo un ListAdapter que debería manejar la lista para mostrar un ListView de 2 líneas:
public class SessionListAdapter extends BaseAdapter {
private ArrayList<Session> sessions;
//private Session[] sl;
private LayoutInflater mInflater;
public SessionListAdapter(Context context, ArrayList<Session> sl) {
sessions = sl;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return sessions.size();
}
public Object getItem(int position) {
return sessions.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.session_two_line_list, null);
holder = new ViewHolder();
holder.title = (TextView) convertView.findViewById(R.id.session_title);
holder.time = (TextView) convertView.findViewById(R.id.session_time);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(sessions.get(position).getTitle());
holder.time.setText(sessions.get(position).getTimeSpan());
return convertView;
}
static class ViewHolder {
TextView title;
TextView time;
}
}
En mi actividad principal, estoy tratando de mostrar la lista usando el adaptador de la lista:
...
this.lv1 = (ListView) view.findViewById(R.id.SessionListView);
// get sessions
this.sessionList = Guide.getSessionsByTrack(0); // errors here and complains that this method must be static
final SessionListAdapter lv1adapter = new SessionListAdapter(this, this.sessionList);
lv1.setAdapter(lv1adapter);
...
Mi único problema en el Guía.getSessionsByTrack El método no me permite utilizar esto. Sesiones mientras que ese método es estático. Debe ser el lista de sesiones Sea estático, ¿y si quisiera actualizar la lista, no debería ser esto estático?
Este pequeño hipo es lo único que me mantiene de mi objetivo y cualquier ayuda sería muy apreciada.
Solución
Tienes dos problemas allí.
Primero haciendo algo como esto ...
Guide.getSessionsByTrack(...);
... significa que está intentando hacer referencia a un método por su nombre de clase principal en lugar de a través de una instancia de referencia (e instanciada) de un Guide
objeto. En este caso, sí, el método debe declararse como static
Porque no estás instanciando explícitamente una instancia del Guide
clase.
El segundo problema que tienes es que getSessionsByTrack(...)
¿No es realmente un método que pertenece al Guide
clase misma, más bien pertenece a un private
clase interior (Session
). Básicamente, este método no puede accesible de todos modos.
Debe arreglar ambos antes de que funcione. O cree un public static
método en tu Guide
clase que en sí mismo llama a un static
método en el Session
clase o crear una instancia de Guide
y proporcionar un similar get
Método al que se puede acceder públicamente.
También parece tener un malentendido sobre static
En que crees que significa que las cosas no se pueden actualizar. Eso sería final
(en otras palabras 'constante') el uso de static
tiene un significado diferente. Te sugiero que leas en el Java final
y static
uso.