Le contenu de cet article a été vérifié dans l'environnement suivant.
nom de la classe | La description | Où est-il dans ListView? |
---|---|---|
RecyclerView | RecyclerView lui-même. Widget. | Équivalent à ListView lui-même |
RecyclerView.Adapter | Généré en définissant une ligne de données dans une ligne de View | Equivalent à l'adaptateur ListView |
RecyclerView.ViewHolder | Contient une ligne de référence de vue (widget) | Dans ListView, la mise en page a été gonflée avec la méthode getItem. Dans RecyclerView, la vue de la disposition pour une ligne est conservée dans la sous-classe de ViewHolder. |
RecyclerView.LayoutManager | Une classe qui gère de manière réactive la mise en page en tenant compte de la taille d'un élément de données, etc. | N'existe pas dans ListView. |
La présentation la plus simple de RecyclerView est présentée ci-dessous. La grande différence avec ListView est que dans ListView, gonfler et obtenir les données du fichier de disposition dans la méthode getItem, Il est stocké dans View. Dans RecyclerView, chacun doit être défini comme un processus indépendant (méthode ou classe).
J'ai créé une application très simple. Contenu qui n'affiche que l'image et le titre sur une seule ligne et des informations détaillées en dessous. Le but de cette fois n'est pas un affichage compliqué, mais pour comprendre la méthode de mise en œuvre de base de RecyclerView, j'en ai fait une application si simple.
Vous pouvez tirer le meilleur parti de l'achèvement des entrées en créant des enfants dans l'ordre suivant.
Pour utiliser RecyclerView, vous devez ajouter une bibliothèque de support.
build.gradle
dependencies {
compile 'com.android.support:recyclerview-v7:25.3.1'
}
row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="0.5"/>
<TextView
android:id="@+id/detail"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="0.5"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
RowData.java
package jp.co.casareal.sample.recyclerviewsample.model;
/**
* Created by naoi on 2017/04/25.
*/
public class RowData {
private String title;
private String detail;
・ ・ ・ Setter/getter omis ...
}
L'adaptateur obtient une référence de vue à partir de la disposition de ligne gonflée et la conserve dans le champ public </ b>.
CasarealViewHolder.java
package jp.co.casareal.sample.recyclerviewsample.viewholder;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import jp.co.casareal.sample.recyclerviewsample.R;
/**
* Created by naoi on 2017/04/25.
*/
public class CasarealViewHolder extends RecyclerView.ViewHolder {
public TextView titleView;
public TextView detailView;
public CasarealViewHolder(View itemView) {
super(itemView);
titleView = (TextView) itemView.findViewById(R.id.title);
detailView = (TextView) itemView.findViewById(R.id.detail);
}
}
CasarealRecycleViewAdapter.java
package jp.co.casareal.sample.recyclerviewsample.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import jp.co.casareal.sample.recyclerviewsample.R;
import jp.co.casareal.sample.recyclerviewsample.model.RowData;
import jp.co.casareal.sample.recyclerviewsample.viewholder.CasarealViewHolder;
/**
* Created by naoi on 2017/04/25.
*/
public class CasarealRecycleViewAdapter extends RecyclerView.Adapter<CasarealViewHolder> {
private List<RowData> list;
public CasarealRecycleViewAdapter(List<RowData> list) {
this.list = list;
}
@Override
public CasarealViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent,false);
CasarealViewHolder vh = new CasarealViewHolder(inflate);
return vh;
}
@Override
public void onBindViewHolder(CasarealViewHolder holder, int position) {
holder.titleView.setText(list.get(position).getTitle());
holder.detailView.setText(list.get(position).getDetail());
}
@Override
public int getItemCount() {
return list.size();
}
}
.java
@Override
public CasarealViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent,false);
CasarealViewHolder vh = new CasarealViewHolder(inflate);
return vh;
}
Correspond à ① et ② de "RecyclerView vu sur la figure".
.java
@Override
public void onBindViewHolder(CasarealViewHolder holder, int position) {
holder.titleView.setText(list.get(position).getTitle());
holder.detailView.setText(list.get(position).getDetail());
}
Correspond à ③ et ④ de "RecyclerView vu sur la figure".
.java
@Override
public int getItemCount() {
return list.size();
}
Cette méthode doit renvoyer le nombre total d'éléments à afficher.
De plus, l'ensemble de données à afficher par le constructeur, etc. est transmis.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="jp.co.casareal.sample.recyclerviewsample.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/casarealRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
Comme avec ListView, vous devrez définir l'adaptateur ultérieurement, vous devez donc spécifier l'ID dans RecyclerView.
MainActivity.java
package jp.co.casareal.sample.recyclerviewsample;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import jp.co.casareal.sample.recyclerviewsample.adapter.CasarealRecycleViewAdapter;
import jp.co.casareal.sample.recyclerviewsample.model.RowData;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView rv = (RecyclerView) findViewById(R.id.casarealRecyclerView);
CasarealRecycleViewAdapter adapter = new CasarealRecycleViewAdapter(this.createDataset());
LinearLayoutManager llm = new LinearLayoutManager(this);
rv.setHasFixedSize(true);
rv.setLayoutManager(llm);
rv.setAdapter(adapter);
}
private List<RowData> createDataset() {
List<RowData> dataset = new ArrayList<>();
for (int i = 0; i < 50; i++) {
RowData data = new RowData();
data.setTitle("Casa Real Taro" + i + "problème");
data.setDetail("Casa Real Taro" + i + "J'aime les morceaux frits");
dataset.add(data);
}
return dataset;
}
}
.java
LinearLayoutManager llm = new LinearLayoutManager(this);
rv.setLayoutManager(llm);
L'une des fonctionnalités utiles que ListView n'a pas est le LayoutManager utilisé pour afficher les données de manière réactive. Cette fois, j'utilise LinerLayout, mais il y a aussi Grid et ainsi de suite.
.java
rv.setHasFixedSize(true);
Si le nombre de données à afficher est de longueur fixe, il s'agit d'un paramètre qui utilise efficacement les ressources et améliore les performances.
.java
CasarealRecycleViewAdapter adapter = new CasarealRecycleViewAdapter(this.createDataset());
rv.setAdapter(adapter);
Réglez l'adaptateur.
.java
private List<RowData> createDataset() {
List<RowData> dataset = new ArrayList<>();
for (int i = 0; i < 50; i++) {
RowData data = new RowData();
data.setTitle("Casa Real Taro" + i + "problème");
data.setDetail("Casa Real Taro" + i + "J'aime les morceaux frits");
dataset.add(data);
}
return dataset;
}
L'ensemble de données à afficher est généré par la méthode createDataset.
Il s'agit de la version Kotlin, mais si vous voulez savoir comment opérer par glisser-déposer ou glisser, veuillez vous référer à l'article suivant.
Suppression du déplacement et du glissement par glisser-déposer dans RecyclerView
Créer des listes et des cartes https://developer.android.com/training/material/lists-cards.html?hl=ja#CardView
API https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html
Recommended Posts