Android Liste simple avec LinearLayoutManager


Exemple

Cet exemple ajoute une liste des lieux avec l' image et le nom en utilisant une ArrayList de la coutume Place des objets comme jeu de données.

Disposition de l'activité

La disposition de l'activité / du fragment ou de l'emplacement où RecyclerView est utilisé doit uniquement contenir RecyclerView. Il n'y a pas de ScrollView ou une disposition spécifique nécessaire.

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

Définir le modèle de données

Vous pouvez utiliser n'importe quel type de données de classe ou primitive en tant que modèle, comme int , String , float[] ou CustomObject . RecyclerView fera référence à une List de ces objets / primitives.

Lorsqu'un élément de liste fait référence à différents types de données tels que du texte, des nombres, des images (comme dans cet exemple avec des espaces), il est souvent utile d'utiliser un objet personnalisé.

public class Place {
    // these fields will be shown in a list item
    private Bitmap image;
    private String name;

    // typical constructor
    public Place(Bitmap image, String name) {
        this.image = image;
        this.name = name;
    }

    // getters
    public Bitmap getImage() {
        return image;
    }
    public String getName() {
        return name;
    } 
}

Mise en page des éléments de la liste

Vous devez spécifier un fichier de présentation xml qui sera utilisé pour chaque élément de la liste. Dans cet exemple, un ImageView est utilisé pour l'image et un TextView pour le nom. Le LinearLayout positionne le ImageView à gauche et le TextView droit à l'image.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="8dp">

    <ImageView
        android:id="@+id/image"
        android:layout_width="36dp"
        android:layout_height="36dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp" />

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

Créez un adaptateur RecyclerView et ViewHolder

Ensuite, vous devez hériter de RecyclerView.Adapter et du RecyclerView.ViewHolder . Une structure de classe habituelle serait:

public class PlaceListAdapter extends RecyclerView.Adapter<PlaceListAdapter.ViewHolder> {
    // ...

    public class ViewHolder extends RecyclerView.ViewHolder {
        // ...
    }
}

Tout d'abord, nous implémentons le ViewHolder . Il hérite uniquement du constructeur par défaut et enregistre les vues nécessaires dans certains champs:

public class ViewHolder extends RecyclerView.ViewHolder {
    private ImageView imageView;
    private TextView nameView;

    public ViewHolder(View itemView) {
        super(itemView);

        imageView = (ImageView) itemView.findViewById(R.id.image);
        nameView = (TextView) itemView.findViewById(R.id.name);
    }
}

Le constructeur de l'adaptateur définit le jeu de données utilisé:

public class PlaceListAdapter extends RecyclerView.Adapter<PlaceListAdapter.ViewHolder> {
    private List<Place> mPlaces;

    public PlaceListAdapter(List<Place> contacts) {
        mPlaces = contacts;
    }

    // ...
}

Pour utiliser notre disposition d'élément de liste personnalisée, nous onCreateViewHolder(...) la méthode onCreateViewHolder(...) . Dans cet exemple, le fichier de disposition est appelé place_list_item.xml .

public class PlaceListAdapter extends RecyclerView.Adapter<PlaceListAdapter.ViewHolder> {
    // ...

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.place_list_item,
                parent,
                false
        );
        return new ViewHolder(view);
    }

    // ...
}

Dans le onBindViewHolder(...) , nous définissons réellement le contenu des vues. Nous obtenons le modèle utilisé en le trouvant dans la List à la position donnée, puis nous définissons l'image et le nom sur les ViewHolder du ViewHolder .

public class PlaceListAdapter extends RecyclerView.Adapter<PlaceListAdapter.ViewHolder> {
    // ...

    @Override
    public void onBindViewHolder(PlaceListAdapter.ViewHolder viewHolder, int position) {
        Place place = mPlaces.get(position);

        viewHolder.nameView.setText(place.getName());
        viewHolder.imageView.setImageBitmap(place.getImage());
    }

    // ...
}

Nous devons également mettre en œuvre getItemCount() , qui renvoie simplement la List taille de.

public class PlaceListAdapter extends RecyclerView.Adapter<PlaceListAdapter.ViewHolder> {
    // ...

    @Override
    public int getItemCount() {
        return mPlaces.size();
    }

    // ...
}

(Générer des données aléatoires)

Pour cet exemple, nous allons générer des endroits aléatoires.

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    List<Place> places = randomPlaces(5);

    // ...
}

private List<Place> randomPlaces(int amount) {
    List<Place> places = new ArrayList<>();
    for (int i = 0; i < amount; i++) {
        places.add(new Place(
                BitmapFactory.decodeResource(getResources(), Math.random() > 0.5 ?
                        R.drawable.ic_account_grey600_36dp :
                        R.drawable.ic_android_grey600_36dp
                ),
                "Place #" + (int) (Math.random() * 1000)
        ));
    }
    return places;
}

Connectez le RecyclerView à la PlaceListAdapter et à l'ensemble de données

Connecter un RecyclerView à un adaptateur est très simple. Vous devez définir LinearLayoutManager comme gestionnaire de disposition pour obtenir la disposition de liste.

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    recyclerView.setAdapter(new PlaceListAdapter(places));
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
}

Terminé!