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
.
- ¿Cómo pasar el contexto de la aplicación (Android) a una clase Java?
- OnBind () en servicio siempre devuelve Falso - Android
- ¿Se destruye el contexto de la aplicación Android?
- Android toast.makeText error de contexto
- ¿Cómo se crea un contexto en Android? ¿Cuál es el propósito de ContextThemeWrapper?
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.
- Context.getApplicationContext () devuelve null en un Service
- Cómo obtener el contexto MainActivity en la clase CustomView
- ¿Cómo obtener mi contexto de actividad?
- ¿Cómo llamar a un método de actividad finish () del objeto Application?
- IsolatedContext vs AndroidTestCase.getContext ()
- La mejor manera de obtener un contexto de aplicación en un método estático en Android
- ¿Cómo puedo acceder a la UI de la actividad de mi clase?
- ¿Por qué AndroidTestCase.getContext (). GetApplicationContext () devuelve null?
La obtención del Contexto en el constructor tiene (al menos) tres ventajas:
- Usted lo hace solamente una vez, no cada vez,
getView()
se llama. - También puede utilizarlo para otros fines, cuando sea necesario.
- También funciona, cuando
parent
esnull
.
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
- Instalación de Android / Eclipse en Ubuntu 11.04 – aapt y adb no funcionan correctamente
- Android layout_width vista – ¿cómo cambiar de forma programática?