Tornar Android ArrayAdapters uma porcaria um pouco menos

Se você já trabalhou com Android ListViews, provavelmente sabe que pode ser um pouco trabalhoso apenas fazer uma lista de objetos.

Vindo de Backbone.js, eu realmente gosto do modelo MVC (onde “C” é “Coleção” aqui), então quero mapear alguns conjuntos de objetos (Coleção de Modelos) para um ViewList.

Eu escrevi uma pequena classe EasyArrayAdapterusando genéricos que eliminam muito do boilerplate. No construtor, você fornece a ele o atual Context, seu ID de recurso de layout e sua coleção.

Em seguida, você só precisa implementar seu ViewHolder ( aprenda sobre o padrão ViewHolder aqui ) e o mapeamento entre seu modelo e sua visualização ( onDrawView). Torna-se ainda mais leve se você estiver usando ButterKnife .

Fonte (essência)

Exemplo

Modelo

class Car {
String model;
int year;

public void start(){
//start the car
}

...
}

Layout

R.layout.car_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout >="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/model" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/year" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/startButton" />
</LinearLayout>

AdapterView

public class CarArrayAdapter extends EasyArrayAdapter<Car, CarArrayAdapter.ViewHolder> {
public CarArrayAdapter(Context context, List<Car> collection){
super(context, R.layout.car_item, collection);
}

@Override
protected void onDrawView(final Controller c, ViewHolder h) {
h
.model.setText(c.getModel());
h
.year.setText(String.valueOf(c.getYear()));
h
.startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
c
.start();
}
});
}


@Override
protected ViewHolder createViewHolder(View v) {
return new ViewHolder(v);
}

protected class ViewHolder {
@InjectView(R.id.model) TextView model;
@InjectView(R.id.year) TextView year;
@InjectView(R.id.startButton) Switch startButton;
public ViewHolder(View view) {
ButterKnife.inject(this, view);
}
}
}

Em sua atividade

carsListView.setAdapter(new CarsArrayAdapter(this, myCars));