web-dev-qa-db-fra.com

Comment définir les deux lignes d'un ListView en utilisant simple_list_item_2?

Ainsi, ce qui suit créera un ListView où les lignes auront leur vue de texte "principale" remplie par le tableau de valeurs.

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
    Android.R.layout.simple_list_item_2, Android.R.id.text1, values);

La modification du troisième paramètre sur Android.R.id.text2 définit la vue de texte "secondaire". Existe-t-il un moyen simple de définir les deux?

34
Andrew Rabon

AFAIK simple_list_item_2 contient un TwoLineListItem contenant deux TextViews. ArrayAdapter ne fonctionnera pas ici, vous devrez soit créer un adaptateur personnalisé, soit en utiliser un qui le prend en charge comme SimpleCursorAdapter.

ListAdapter adapter = new SimpleCursorAdapter(
                 this,
                 Android.R.layout.simple_list_item_2,
                 mCursor,     // Pass in the cursor to bind to.
                 new String[] {People.NAME, People.COMPANY}, // Array of cursor columns to bind to.
                 new int[] {Android.R.id.text1, Android.R.id.text2});  // Parallel array of which template objects to bind to those columns.

         // Bind to our new adapter.
         setListAdapter(adapter);

Ou si vous ne voulez pas SimpleCursorAdapter, vous devrez créer un ArrayAdapter personnalisé ou un BaseAdapter

Créez un ArrayAdapter personnalisé, appliquez le tableau d'objets (ayant deux éléments) à l'adaptateur personnalisé et alimentez-le dans getListView.setAdapter.

Remplacez la méthode getView d'ArrayAdapter pour appliquer vos chaînes de nom à TextViews dans votre affichage de ligne de liste personnalisé.

Suivre l'extrait de code vous aidera.

SampleActivity.Java

package org.sample;

import Java.util.ArrayList;

import Android.app.ListActivity;
import Android.content.Context;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.BaseAdapter;
import Android.widget.TextView;
import Android.widget.TwoLineListItem;

public class SampleActivity extends ListActivity {

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        Person person;

        ArrayList<Person> persons = new ArrayList<Person>();

        person = new Person();
        person.setName("Vipul");
        person.setAge(20);
        persons.add(person);

        person = new Person();
        person.setName("Anil");
        person.setAge(22);
        persons.add(person);

        setListAdapter(new MyAdapter(this, persons));
    }

}

Person.Java

class Person {
    String name;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

MyAdapter.Java

class MyAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<Person> persons;

    public MyAdapter(Context context, ArrayList<Person> persons) {
        this.context = context;
        this.persons = persons;
    }

    @Override
    public int getCount() {
        return persons.size();
    }

    @Override
    public Object getItem(int position) {
        return persons.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        TwoLineListItem twoLineListItem;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            twoLineListItem = (TwoLineListItem) inflater.inflate(
                    Android.R.layout.simple_list_item_2, null);
        } else {
            twoLineListItem = (TwoLineListItem) convertView;
        }

        TextView text1 = twoLineListItem.getText1();
        TextView text2 = twoLineListItem.getText2();

        text1.setText(persons.get(position).getName());
        text2.setText("" + persons.get(position).getAge());

        return twoLineListItem;
    }
}
43
Vipul Shah

Cette question occupe un rang élevé avec Google, mais je considère que la réponse donnée est beaucoup trop compliquée. Comme indiqué dans les réponses other , la fonctionnalité souhaitée peut être obtenue en utilisant ArrayAdapter avec une astuce très simple.

Vous pouvez remplacer la méthode getView de ArrayAdapter:

ArrayAdapter adapter = new ArrayAdapter(context, Android.R.layout.simple_list_item_2, Android.R.id.text1, list) {
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    TextView text1 = (TextView) view.findViewById(Android.R.id.text1);
    TextView text2 = (TextView) view.findViewById(Android.R.id.text2);

    text1.setText(persons.get(position).getName());
    text2.setText(persons.get(position).getAge());
    return view;
  }
};

Si vous ne l'avez pas remarqué: l'astuce consiste à fournir Android.R.id.text1 comme paramètre (principalement inutile), sinon l'appel à super provoquera une exception.

De plus, cette solution n'utilise pas TwoLineListItem, qui était obsolète dans l'API 17.

107
winne2

j'espère que cela vous aide

ArrayAdapter<CustomObject> adapter = new ArrayAdapter<CustomObject> (_context, Android.R.layout.simple_list_item_2, Android.R.id.text1, listCustomObject) {

                                @Override
                                public View getView(int position,
                                        View convertView, ViewGroup parent) {
                                    View view = super.getView(position, convertView, parent);

                                    TextView text1 = (TextView) view.findViewById(Android.R.id.text1);
                                    TextView text2 = (TextView) view.findViewById(Android.R.id.text2);

                                    text1.setText(listCustomObject.get(position).getText1());

                                    text2.setText( listCustomObject.get(position).getText2() );

                                    return view;
                                }

                            };
5
Shan Xeeshi

peut essayer aussi ...

adapter = new ArrayAdapter(this,Android.R.layout.simple_list_item_2,values){
            @Override
            public View getView(int position, View convertView, ViewGroup parent){

               TwoLineListItem   row = (TwoLineListItem)super.getView(position, convertView, parent);

                row.getText1().setText(values.get***());
                row.getText2().setText(values.get****());

                return row;
            }
        };
    setAdapter(adapter);
2
Dheeresh Singh