java - tipos - ¿Por qué en el patrón ViewHolder la clase ViewHolder debería ser estática?
recyclerview android studio ejemplo (2)
Solo intento comprender mejor el siguiente patrón que uso regularmente para optimizar ListView
Mis lecturas solo me indicaron el hecho de que una clase interna estática se trata como una clase de nivel superior. ¿Cuál es el beneficio de tal cosa en comparación con una clase miembro (no estática)?
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Comment comment = getItem(position);
ViewHolder holder;
if (convertView == null){
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.mylayout, null);
holder.nickname = (TextView) ((ViewGroup) convertView).findViewById(R.id.nickname);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.nickname.setText(comment.getMember_nickname());
CharSequence
return convertView;
}
public static class ViewHolder{
TextView nickname;
}
Mi opinión es que es mejor tener la clase estática ViewHolder ya que no perderá el adaptador.
Si el adaptador retiene algunas Colecciones pesadas o incluso Vistas (depende de cada caso particular), sería genial mantener el control de qué objetos retienen el Adaptador.
Al tener una gran cantidad de objetos, las instancias de una clase interna tendrán esos objetos que hacen referencia al Adaptador y, por lo tanto, lo retienen. Debe tener cuidado con la forma en que se administran las etiquetas (si las vistas se limpian / eliminan automáticamente, no hay problema>).
Una de las ventajas de usar la clase interna estática es que se puede acceder a la clase interna desde métodos estáticos, sin tener una instancia de la clase externa.
Si la clase interna no estática:
class MyOuter {
private int x = 7;
public void makeInner() {
MyInner in = new MyInner();
in.seeOuter();
}
class MyInner {
public void seeOuter() {
System.out.println("Outer x is " + x);
}
}
}
public static void main(String[] args) {
MyOuter mo = new MyOuter();
MyOuter.MyInner inner = mo.new MyInner();
inner.seeOuter();
}
Si la clase interna es estática:
class BigOuter {
static class Nest {void go() { System.out.println("hi"); } }
}
class Broom {
static class B2 {void goB2() { System.out.println("hi 2"); } }
public static void main(String[] args) {
BigOuter.Nest n = new BigOuter.Nest();
n.go();
B2 b2 = new B2();
b2.goB2();
}
}