2012-08-27 20 views
39

En muchos de los ejemplos de código que encuentro en Internet, el context se obtiene en el constructor de un adaptador.Obtener el contexto de Android en un adaptador

Este contexto se utiliza para obtener un inflater para inflar las vistas en el método getView.

Mi pregunta es ¿por qué preocuparse conseguir el contexto en el constructor cuando se puede obtener fácilmente al igual que

 LayoutInflater inflater; 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if(inflater == null){ 
      Context context = parent.getContext(); 
      inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      } 
      ... 
      ... 

      return convertView; 
     } 

También hay alguna razón para no usar el método anterior, ya que hasta ahora no se han enfrentado a cualquier problema al usarlo.

+3

si usted no tiene un padre? – Blackbelt

+1

puede usar directamente 'LayoutInflater' por 'getLayoutInflater()' de su Actividad. –

Respuesta

27

Obtención del contexto en el constructor tiene (al menos) tres ventajas:

  1. Solo lo hace una vez, no todas las veces, se llama getView().
  2. También puede usarlo para otros fines, cuando sea necesario.
  3. También funciona, cuando parent es null.

Sin embargo, si no tiene ningún problema con la solución, también puede cumplirla.

+2

- No entiendo el contexto cada vez que se llama a 'getView', solo cuando el inflador es nulo - Personalmente nunca he necesitado el contexto en ningún lado fuera de' getview' - Ser padre nulo parece raro, pero esto es un punto válido – Gautam

+0

@GautamK, tienes razón, me lo perdí. – Ridcully

1

¿Qué pasa si alguien crea una clase que usa BaseAdapter para almacenar vistas en algún lugar (y, tal vez, las adjunte al padre más adelante)? En este caso, parent puede ser null.

No es un gran problema, decide por ti mismo qué es mejor.

Por ejemplo:

public class MockWithAdapter{ 

    private BaseAdapter mAdapter; 

    public MockWithAdapter(BaseAdapter adapter){ 
     mAdapter = adapter; 
    } 

    public List<View> mock(){ 
     int size = mAdapter.getCount(); 
     List<View> views = new ArrayList(size); 
     for(int i=0; i<size; i++) 
      views.add(mAdapter.getView(i, null, null)); 

     return views; 
    } 
} 

Y luego se puede hacer con vistas lo que quieras:

MockWithAdapter m = new MockWithAdapter(adapter); 
ListView lv = new ListView(context); 
for(View v : m.mock) 
    lv.addView(v); 
+0

Ese es en realidad un punto interesante, pero ¿puedes por favor elaborar con algún código para que pueda entender completamente – Gautam

+0

@GautamK aquí hay un ejemplo –

+1

En la presentación de 'Romain Guy' y' Adam Powell', Ellos aconsejan no usar un local ver caché http://dl.google.com/googleio/2010/android-world-of-listview-android.pdf – Gautam

1

Aquí se muestra un ejemplo:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    Holder holder; 
    if (view == null) { 
     view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.item_job, parent, false); 
     holder = new Holder(view, this); 
     view.setTag(holder); 
    } else { 
     holder = (Holder) view.getTag(); 
    } 

    holder.parse(getItem(position), position); 
    return view; 
} 

public class Holder { 

    @Bind(R.id.type) 
    TextView type; 
    @Bind(R.id.date_time) 
    TextView dateTime; 
    @Bind(R.id.grade) 
    TextView grade; 

    public Holder(View view) { 
     ButterKnife.bind(this, view); 
    } 

    public void parse(final GetGradeHistoryResponse.GradeHistory item) { 
     if (item.grade < 0) { 
      grade.setTextColor(App.getInstance() 
        .getResources().getColor(R.color.withdraw_status)); 
      grade.setText(String.valueOf(item.grade)); 
     } else { 
      grade.setTextColor(App.getInstance() 
        .getResources().getColor(R.color.primary)); 
      grade.setText("+" + String.valueOf(item.grade)); 
     } 

     type.setText(item.type); 
     dateTime.setText(item.datetime); 
    } 
} 

Puede obtener el contexto de view.getContext() in the Holder

Cuestiones relacionadas