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:
- Solo lo haces una vez, no siempre, se llama a
getView()
. - También puede utilizarlo para otros fines, cuando sea necesario.
- También funciona, cuando el
parent
esnull
.
Sin embargo, si no tiene ningún problema con su solución, puede seguirla.