studio programacion herramientas fundamentos con avanzado aplicaciones android android-adapter android-context

programacion - manual de android en pdf



Consiguiendo el contexto de Android en un adaptador (3)

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 usa 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 tal.

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 porque hasta ahora no he tenido ningún problema en usarlo.


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

No es un problema tan grande, 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 puedes hacer con estas vistas lo que quieras:

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


Obtener el contexto en el constructor tiene (al menos) tres ventajas:

  1. Solo lo haces una vez, no siempre, se llama a getView() .
  2. También puede utilizarlo para otros fines, cuando sea necesario.
  3. También funciona, cuando el parent es null .

Sin embargo, si no tiene ningún problema con su solución, puede seguirla.