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)
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.
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>
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
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.
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.
Recommended Posts