web-dev-qa-db-fra.com

Comment utiliser ArrayAdapter <myClass>

ArrayList<MyClass> myList = new ArrayList<MyClass>();

ListView listView = (ListView) findViewById(R.id.list);

ArrayAdapter<MyClass> adapter = new ArrayAdapter<MyClass>(this, R.layout.row,
    to, myList.);
listView.setAdapter(adapter);

Classe: MyClass

class MyClass {
    public String reason;
    public long long_val;
}

J'ai créé row.xml dans des mises en page, mais je ne sais pas comment afficher à la fois raison et long_val dans ListView à l'aide de ArrayAdapter.

126
Sumit M Asok

Implémentez un adaptateur personnalisé pour votre classe:

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) {
            // My layout has only one TextView
                // do whatever you want with your string and long
            viewHolder.itemView.setText(String.format("%s %d", item.reason, item.long_val));
        }

        return convertView;
    }
}

Pour ceux qui ne connaissent pas très bien le framework Android, ceci est expliqué plus en détail ici: https://github.com/codepath/Android_guides/wiki/Using-an-ArrayAdapter -with-ListView .

153
Nikola Smiljanić

Vous pouvez simplement ajouter une méthode toString() à MyClass, par http://developer.Android.com/reference/Android/widget/ArrayAdapter.html :

Cependant, le TextView est référencé, il sera rempli avec le toString () de chaque objet du tableau. Vous pouvez ajouter des listes ou des tableaux d'objets personnalisés. Redéfinissez la méthode toString () de vos objets pour déterminer le texte à afficher pour l'élément de la liste.

class MyClass {

 @Override
 public String toString() {
  return "Hello, world.";
 }
}
76
user139444

Je pense que c'est la meilleure approche. L'utilisation de la classe ArrayAdapter générique et l'extension de votre propre adaptateur d'objet est aussi simple que suit:

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);
    }
  }
}

et voici votre adaptateur (exemple):

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());
  }

}

et enfin, comment l'initialiser:

ArrayList<Size> sizes = getArguments().getParcelableArrayList(Constants.ARG_PRODUCT_SIZES);
SizeArrayAdapter sizeArrayAdapter = new SizeArrayAdapter(getActivity(), sizes);
listView.setAdapter(sizeArrayAdapter);

J'ai créé un Gray personnalisable ArrayAdapter avec TextView layout:

https://Gist.github.com/m3n0R/88228

22
cesards

Sous-classez le ArrayAdapter et substituez la méthode getView () pour renvoyer votre propre vue contenant le contenu que vous souhaitez afficher.

6
Klarth

Voici un exemple rapide et compliqué d'utilisation d'un ArrayAdapter si vous ne voulez pas vous embêter avec l'extension de la classe mère:

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!");
            }
        });
    }
}
5
Francois Dermu