Cómo obtener el contexto de Android en un adaptador

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

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

Mi pregunta es por qué molestarse en obtener el contexto en el constructor cuando se puede obtener fácilmente como así

  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 utilizar el método anterior porque hasta ahora no he enfrentado ningún problema en su uso.

La obtención del Contexto en el constructor tiene (al menos) tres ventajas:

  1. Usted lo hace solamente una vez, no cada vez, getView() se llama.
  2. También puede utilizarlo para otros fines, cuando sea necesario.
  3. También funciona, cuando parent es null .

Sin embargo, si usted no tiene ningún problema con su solución, es posible que también se adhieren a ella.

¿Qué pasa si alguien va a crear una clase que utiliza BaseAdapter para almacenar las vistas en algún lugar (y, tal vez, se adjuntará a los padres más tarde)? En este caso, el parent puede ser null .

No es un problema tan grande, decidir por ti mismo lo que 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 entonces usted puede hacer con este puntos de vista lo que quiera:

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

Aquí hay 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 por view.getContext() in the Holder

  • ¿Cuándo se llama a getApplicationContext () de la clase Application?
  • ¿Por qué mi contexto en mi Fragmento es nulo?
  • Utilizar el editor de diseño de manera efectiva en diseños con fragmentos no estáticos
  • ¿Cuál es la diferencia entre la actividad y el contexto?
  • Android: ProgressDialog no se muestra
  • Diferencia entre getApplicationContext y classname.this
  • getApplicationContext () devuelve null, pero funciona en otras actividades
  • Get Context en la clase non-Activity
  • Cambiar el nombre de un archivo en el almacenamiento interno
  • ¿Qué es "Contexto" en Android?
  • ¿En qué caso se devuelve bindService?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.