Zaimplementuj niestandardowy adapter dla swojej klasy:
public class MyClassAdapter extends ArrayAdapter<MyClass> {
private static class ViewHolder {
private TextView itemView;
}
public MyClassAdapter(Context context, int textViewResourceId, ArrayList<MyClass> items) {
super(context, textViewResourceId, items);
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(this.getContext())
.inflate(R.layout.listview_association, parent, false);
viewHolder = new ViewHolder();
viewHolder.itemView = (TextView) convertView.findViewById(R.id.ItemView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
MyClass item = getItem(position);
if (item!= null) {
viewHolder.itemView.setText(String.format("%s %d", item.reason, item.long_val));
}
return convertView;
}
}
Dla osób niezbyt zaznajomionych z platformą Android wyjaśniono to bardziej szczegółowo tutaj: https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView .
textViewResourceId
nie zostało użyte powyżej?Możesz po prostu dodać
toString()
metodę do MyClass, na http://developer.android.com/reference/android/widget/ArrayAdapter.html :class MyClass { @Override public String toString() { return "Hello, world."; } }
źródło
MyClass
, będziesz musiał refaktoryzować. Wreszcie, generalnie złym pomysłem jest powiązanie logiki prezentacji z modelami. Modele nie powinny być świadome tego, w jaki sposób są prezentowane użytkownikowi.MyClass
wymagałaby dodania dedykowanej klasy o nazwie,MyClassView
która otacza model bazowy (i zapewniatoString( )
implementacjęMyślę, że to najlepsze podejście. Użycie ogólnej klasy ArrayAdapter i rozszerzenie własnego adaptera Object jest tak proste, jak poniżej:
public abstract class GenericArrayAdapter<T> extends ArrayAdapter<T> { // Vars private LayoutInflater mInflater; public GenericArrayAdapter(Context context, ArrayList<T> objects) { super(context, 0, objects); init(context); } // Headers public abstract void drawText(TextView textView, T object); private void init(Context context) { this.mInflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder vh; if (convertView == null) { convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false); vh = new ViewHolder(convertView); convertView.setTag(vh); } else { vh = (ViewHolder) convertView.getTag(); } drawText(vh.textView, getItem(position)); return convertView; } static class ViewHolder { TextView textView; private ViewHolder(View rootView) { textView = (TextView) rootView.findViewById(android.R.id.text1); } } }
a tutaj twój adapter (przykład):
public class SizeArrayAdapter extends GenericArrayAdapter<Size> { public SizeArrayAdapter(Context context, ArrayList<Size> objects) { super(context, objects); } @Override public void drawText(TextView textView, Size object) { textView.setText(object.getName()); } }
i wreszcie, jak go zainicjalizować:
Stworzyłem Gist z ArrayAdapter z możliwością dostosowania grawitacji w układzie TextView:
https://gist.github.com/m3n0R/8822803
źródło
Podklasuj ArrayAdapter i zastąp metodę getView (), aby zwrócić własny widok zawierający zawartość, którą chcesz wyświetlić.
źródło
Oto szybki i nieprzyjemny przykład użycia ArrayAdapter, jeśli nie chcesz zawracać sobie głowy rozszerzaniem klasy matki:
class MyClass extends Activity { private ArrayAdapter<String> mAdapter = null; @Override protected void onCreate(Bundle savedInstanceState) { mAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_dropdown_item_1line, android.R.id.text1); final ListView list = (ListView) findViewById(R.id.list); list.setAdapter(mAdapter); //Add Some Items in your list: for (int i = 1; i <= 10; i++) { mAdapter.add("Item " + i); } // And if you want selection feedback: list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //Do whatever you want with the selected item Log.d(TAG, mAdapter.getItem(position) + " has been selected!"); } }); } }
źródło