[JAVA] Code de modèle minimal pour le développement Android, implémentation de RecyclerView

J'ai essayé de résumer comment mettre en œuvre RecyclerView

J'ai cherché RecyclerView sur le net et créé l'exemple de code qui est sorti, mais cela n'a pas réussi du tout. S'il ne reste plus grand-chose, j'ai décidé de le garder, j'ai donc décidé de résumer Recycer View. (Et je dois l'utiliser au travail)

Qu'est-ce que RecyclerView?

Dans le développement Android, j'avais l'habitude d'implémenter jusqu'à ListView. Cependant, il semble que ListView ne soit pas beaucoup utilisé dans Android récent, et RecyclerView est souvent utilisé. L'implémentation avec ListView n'était pas si difficile, mais je n'ai pas trouvé d'exemple de code RecyclerView décent sur le net, j'ai donc décidé de créer mon propre modèle. RecyclerView est comme une version supérieure de ListView, et pour moi c'est juste une image comme UICollectionView d'iOS. Il semble qu'il convient pour afficher une grande quantité de données de liste, et il est conçu de manière à pouvoir faire défiler efficacement en réutilisant des parties d'écran.

À propos du code source du modèle

RecyclerView.java


public class ScrollListActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scroll_list);

        android.support.v7.widget.Toolbar toolbar = findViewById(R.id.toolbar);
        toolbar.setLogo(R.mipmap.ic_launcher);
        setSupportActionBar(toolbar);
        CollapsingToolbarLayout toolbarLayout = findViewById(R.id.toolbarLayout);
        toolbarLayout.setTitle(getString(R.string.toolbar_title));
        toolbarLayout.setExpandedTitleColor(Color.WHITE);
        toolbarLayout.setCollapsedTitleTextColor(Color.LTGRAY);

        RecyclerView lvMenu = findViewById(R.id.lvMenu);
        LinearLayoutManager layout = new LinearLayoutManager(ScrollListActivity.this);
        lvMenu.setLayoutManager(layout);
        List<Map<String,Object>> menuList = createTeishokuList();
        RecyclerListAdapter adapter = new RecyclerListAdapter(menuList);
        lvMenu.setAdapter(adapter);
    }

    private List<Map<String, Object>> createTeishokuList() {
        List<Map<String, Object>> menuList = new ArrayList<>();

        Map<String, Object> menu = new HashMap<>();
        menu.put("name", "Plat plat frit");
        menu.put("price", 800);
        menu.put("desc", "Jeunes oiseaux frits avec salade, riz et soupe miso.");
        menuList.add(menu);

        menu = new HashMap<>();
        menu.put("name", "Repas de hamburger");
        menu.put("price", 850);
        menu.put("desc", "Hamburger fait à la main avec salade, riz et soupe miso.");
        menuList.add(menu);

        //Répétez l'enregistrement des données ci-dessous.
        menu = new HashMap<>();
        menu.put("name", "Repas grillé au gingembre");
        menu.put("price", 850);
        menu.put("desc", "Gingembre grillé au gingembre râpé avec salade, riz et soupe miso.");
        menuList.add(menu);

        menu = new HashMap<>();
        menu.put("name", "Repas ensemble steak");
        menu.put("price", 1000);
        menu.put("desc", "Steak de boeuf domestique avec salade, riz et soupe miso.");
        menuList.add(menu);

        menu = new HashMap<>();
        menu.put("name", "Repas de légumes sautés");
        menu.put("price", 750);
        menu.put("desc", "Légumes frits de saison avec salade, riz et soupe miso.");
        menuList.add(menu);

        menu = new HashMap<>();
        menu.put("name", "Repas de tonkatsu");
        menu.put("price", 900);
        menu.put("desc", "Loin tonkatsu avec salade, riz et soupe miso.");
        menuList.add(menu);

        menu = new HashMap<>();
        menu.put("name", "Repas haché et fixe");
        menu.put("price", 850);
        menu.put("desc", "Escalope hachée artisanale avec salade, riz et soupe miso.");
        menuList.add(menu);

        menu = new HashMap<>();
        menu.put("name", "Repas côtelette de poulet");
        menu.put("price", 900);
        menu.put("desc", "Une escalope de poulet copieuse avec salade, riz et soupe miso.");
        menuList.add(menu);

        menu = new HashMap<>();
        menu.put("name", "Repas de croquettes");
        menu.put("price", 850);
        menu.put("desc", "Croquette de pommes de terre Hokkaido avec salade, riz et soupe miso.");
        menuList.add(menu);

        menu = new HashMap<>();
        menu.put("name", "Repas de poisson grillé");
        menu.put("price", 850);
        menu.put("desc", "Anguille grillée au sel avec salade, riz et soupe miso.");
        menuList.add(menu);

        menu = new HashMap<>();
        menu.put("name", "Repas de viande grillée");
        menu.put("price", 950);
        menu.put("desc", "Une salade, du riz et une soupe miso sont attachés à la viande grillée.");
        menuList.add(menu);

        return menuList;
    }

    private class RecyclerListViewHolder extends RecyclerView.ViewHolder {
        public TextView _tvMenuName;
        public TextView _tvMenuPrice;
        public RecyclerListViewHolder(View itemView) {
            super(itemView);
            _tvMenuName = itemView.findViewById(R.id.tvMenuName);
            _tvMenuPrice = itemView.findViewById(R.id.tvMenuPrice);
        }
    }

    private class RecyclerListAdapter extends RecyclerView.Adapter<RecyclerListViewHolder> {
        private List<Map<String, Object>> _listData;
        public RecyclerListAdapter(List<Map<String, Object>> listData) {
            _listData = listData;
        }

        //Méthode pour créer un objet de visualisation
        @Override
        public RecyclerListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(ScrollListActivity.this);
            View view = inflater.inflate(R.layout.row, parent, false);
            RecyclerListViewHolder holder = new RecyclerListViewHolder(view);
            return holder;
        }

        //Méthode pour affecter les données à afficher à chaque partie d'écran dans le support de vue
        @Override
        public void onBindViewHolder(RecyclerListViewHolder holder, int position) {
            Map<String, Object> item = _listData.get(position);
            String menuName = (String)item.get("name");
            int menuPrice = (Integer)item.get("price");
            String menuPriceStr = String.valueOf(menuPrice);
            holder._tvMenuName.setText(menuName);
            holder._tvMenuPrice.setText(menuPriceStr);
        }

        //Méthode pour renvoyer le nombre de données
        @Override
        public int getItemCount() {
            return _listData.size();
        }
    }
}

activity_scroll_list.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="180dp"
        android:elevation="10dp">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbarLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                android:background="@color/colorPrimary"/>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

   <android.support.v7.widget.RecyclerView
       android:id="@+id/lvMenu"
       android:scrollbars="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fabEmail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        app:layout_anchor="@id/appbar"
        app:layout_anchorGravity="bottom|end"
        app:srcCompat="@android:drawable/ic_dialog_email"/>
</android.support.design.widget.CoordinatorLayout>

row.xml


<?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:orientation="vertical">

	<TextView
		android:id="@+id/tvMenuName"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:layout_marginLeft="10dp"
		android:layout_marginTop="10dp"
		android:textSize="18sp"/>

	<LinearLayout
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:layout_marginBottom="10dp"
		android:layout_marginLeft="10dp"
		android:orientation="horizontal">

		<TextView
			android:id="@+id/tvMenuPrice"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textSize="14sp"/>

		<TextView
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:text="@string/tv_menu_unit"
			android:textSize="14sp"/>

	</LinearLayout>

</LinearLayout>

À propos des méthodes de classe importantes pour l'utilisation de RecyclerView

RecyclerView.java


private class RecyclerListViewHolder extends RecyclerView.ViewHolder {}

Vous devez créer une classe ViewHolder qui hérite de la classe RecyclerView.ViewHolder. Est-ce la génération d'une classe View comme ʻUITableViewCell` dans une image de type iOS? On dit que l'objet qui contient les parties d'écran de chaque élément est appelé un support de vue.

RecyclerView.java


private class RecyclerListAdapter extends RecyclerView.Adapter<RecyclerListViewHolder> {}

En effet, RecyclerView ne possède pas son propre adaptateur, vous devez donc le personnaliser et l'implémenter vous-même. Étant donné que recyclerView.Adapter est une classe abstraite, il semble qu'il soit nécessaire d'implémenter les trois méthodes suivantes.

onCreateViewHolder: méthode pour créer un objet viewholder onBindViewHolder: une méthode pour placer des données d'affichage dans chaque partie d'écran dans le support de vue getItemCount: méthode qui renvoie le nombre de données

À propos des captures d'écran

Screenshot_1530530217.png

Screenshot_1530530220.png

À propos de la mise en œuvre de diviseurs comme UITableViewCell

En regardant la capture d'écran, il semble que dans le cas de Recyclerview, une ligne de séparation comme UITableViewCell n'est pas implémentée par défaut. Une classe séparée DividerItemDecoration est requise pour insérer la ligne de séparation.

Pour l'implémenter, ajoutez simplement les deux lignes suivantes au bas de la méthode protected void onCreate (Bundle savedInstanceState) de l'activité.

RecyclerView.java


       //Créer un objet pour la ligne de séparation
        DividerItemDecoration decoration = new DividerItemDecoration(ScrollListActivity.this, layout.getOrientation());
        lvMenu.addItemDecoration(decoration);

La ligne de séparation sera maintenant affichée.

À propos des événements de clic

Et si vous appuyez réellement sur RecyclerView pour gérer une action

RecyclerView.java


private class ItemClickListener implements View.OnClickListener

Mettez simplement en œuvre. Écrivons le processus dans cette méthode de classe privée et définissons-le à l'endroit suivant.

RecyclerView.java


        //Méthode pour créer un objet de visualisation
        @Override
        public RecyclerListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(ScrollListActivity.this);
            View view = inflater.inflate(R.layout.row, parent, false);
            view.setOnClickListener(new ItemClickListener()); // <-Ajouter ici
            RecyclerListViewHolder holder = new RecyclerListViewHolder(view);
            return holder;
        }

L'événement de clic est désormais réactif.

Livres de référence

Développer des compétences de base et appliquées! Manuel de développement d'applications Android Pratique pour éviter de devenir développeur

Recommended Posts

Code de modèle minimal pour le développement Android, implémentation de RecyclerView
Premier développement Android pour les gens occupés
Une collection de bibliothèques utiles dans le développement Android
Notes pour les débutants en développement d'applications Android
Directives d'apprentissage pour le développement Android pour les ingénieurs iOS
[Android] Implémentation de ListView à défilement latéral à l'aide de RecyclerView
Exemple de code pour l'implémentation Singleton à l'aide d'énumération
Préparation au développement Android de POCOPHONE f1
Mémorandum des débutants en développement d'applications Android
Développement d'Android Studio pour la première fois (pour les débutants)
Développement Android app_preparation