Der Inhalt dieses Artikels wurde in der folgenden Umgebung überprüft.
Name der Klasse | Erläuterung | Wo ist es in ListView? |
---|---|---|
RecyclerView | RecyclerView selbst. Widget. | Entspricht ListView selbst |
RecyclerView.Adapter | Wird generiert, indem eine Datenzeile in einer Ansichtszeile festgelegt wird | Entspricht dem ListView-Adapter |
RecyclerView.ViewHolder | Enthält eine Referenzlinie für die Ansichtszeile (Widget) | In ListView wurde das Layout mit der Methode getItem aufgeblasen. In RecyclerView befindet sich die Ansicht des Layouts für eine Zeile in der Unterklasse von ViewHolder. |
RecyclerView.LayoutManager | Eine Klasse, die das Layout unter Berücksichtigung der Größe eines Datenelements usw. reaktionsschnell verwaltet. | Existiert nicht in ListView. |
Die einfachste Übersicht über RecyclerView finden Sie unten. Der große Unterschied zu ListView besteht darin, dass in ListView das Aufblasen und Abrufen von Daten aus der Layoutdatei in der getItem-Methode Es wird in der Ansicht gespeichert. In RecyclerView muss jeder als unabhängiger Prozess (Methode oder Klasse) definiert werden.
Ich habe eine sehr einfache App erstellt. Inhalt, der nur das Bild und den Titel in einer Zeile anzeigt, sowie detaillierte Informationen darunter. Der Zweck dieser Zeit ist keine komplizierte Anzeige, aber um die grundlegende Implementierungsmethode von RecyclerView zu verstehen, habe ich sie zu einer so einfachen Anwendung gemacht.
Sie können die Vervollständigung der Eingabe optimal nutzen, indem Sie untergeordnete Elemente in der folgenden Reihenfolge erstellen.
Um RecyclerView verwenden zu können, müssen Sie eine Support-Bibliothek hinzufügen.
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 weggelassen ...
}
Der Adapter erhält eine Ansichtsreferenz aus dem aufgeblasenen Zeilenlayout und hält sie im Feld 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;
}
Entspricht ① und ② von "RecyclerView in der Abbildung".
.java
@Override
public void onBindViewHolder(CasarealViewHolder holder, int position) {
holder.titleView.setText(list.get(position).getTitle());
holder.detailView.setText(list.get(position).getDetail());
}
Entspricht ③ und ④ von "RecyclerView in der Abbildung".
.java
@Override
public int getItemCount() {
return list.size();
}
Diese Methode sollte die Gesamtzahl der anzuzeigenden Elemente zurückgeben.
Außerdem wird der vom Konstruktor usw. anzuzeigende Datensatz übergeben.
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>
Wie bei ListView müssen Sie den Adapter später festlegen, sodass Sie die ID in RecyclerView angeben müssen.
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 + "Problem");
data.setDetail("Casa Real Taro" + i + "Ich mag gebratene Stücke");
dataset.add(data);
}
return dataset;
}
}
.java
LinearLayoutManager llm = new LinearLayoutManager(this);
rv.setLayoutManager(llm);
Eine der nützlichen Funktionen, die in ListView nicht enthalten sind, ist der LayoutManager, mit dem Daten reaktionsschnell angezeigt werden. Dieses Mal verwende ich LinerLayout, aber es gibt auch Grid und so weiter.
.java
rv.setHasFixedSize(true);
Wenn die Anzahl der anzuzeigenden Daten eine feste Länge hat, ist dies eine Einstellung, die Ressourcen effektiv nutzt und die Leistung verbessert.
.java
CasarealRecycleViewAdapter adapter = new CasarealRecycleViewAdapter(this.createDataset());
rv.setAdapter(adapter);
Stellen Sie den Adapter ein.
.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 + "Problem");
data.setDetail("Casa Real Taro" + i + "Ich mag gebratene Stücke");
dataset.add(data);
}
return dataset;
}
Der anzuzeigende Datensatz wird von der Methode createDataset generiert.
Dies ist die Kotlin-Version. Wenn Sie jedoch wissen möchten, wie Sie per Drag & Drop oder Wischen arbeiten, lesen Sie bitte den folgenden Artikel.
Ziehen und Ablegen per Drag & Drop in RecyclerView
Listen und Karten erstellen 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