Bei der Anzeige einer Liste wiederverwendbarer Ansichten unter Android ist ein Widget namens RecyclerView der Mainstream. Aber zuerst kamen mehrere Teile heraus und ich war mir nicht sicher, also werde ich eine Mindestprobe machen.
↓ Abgeschlossenes Bild
Fügen Sie RecyclerView zu build.gradle hinzu.
dependencies {
implementation "androidx.recyclerview:recyclerview:1.1.0"
Schauen wir uns jeden an.
Platzieren Sie die RecyclerView über der Aktivität, für die Sie die RecyclerView anzeigen möchten. (Wenn Sie Fragmente verwenden möchten, gilt dies auch für Fragmente.)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Erstellen Sie als Nächstes ein Layout für eine Zeile. Dieses Mal werde ich es so machen. Dies hängt vom Inhalt der Liste ab, die Sie erstellen möchten.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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="wrap_content"
android:layout_margin="12dp">
<ImageView
android:id="@+id/hoge_image_view"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<TextView
android:id="@+id/hoge_title_text_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:text="hogeTitle"
android:textSize="24dp"
app:layout_constraintTop_toTopOf="@id/hoge_image_view"
app:layout_constraintStart_toEndOf="@id/hoge_image_view"
app:layout_constraintEnd_toEndOf="parent"/>
<TextView
android:id="@+id/hoge_contents_text_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:text="hogeContents"
android:layout_marginTop="12dp"
app:layout_constraintTop_toBottomOf="@id/hoge_title_text_view"
app:layout_constraintStart_toStartOf="@id/hoge_title_text_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Danach spielt die Reihenfolge keine Rolle mehr, aber dieses Mal bereiten wir zuerst den Adapter vor. Dies liegt daran, dass beim Generieren einer RecyclerView eine Reihe von Adaptern erforderlich ist.
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
private List<RowData> rowDataList;
MainAdapter(List<RowData> rowDataList) {
this.rowDataList = rowDataList;
}
/**
*Eine Datenzeile
*/
static class MainViewHolder extends RecyclerView.ViewHolder {
ImageView hogeImage;
TextView hogeTitle;
TextView hogeContents;
MainViewHolder(@NonNull View itemView) {
super(itemView);
hogeImage = itemView.findViewById(R.id.hoge_image_view);
hogeTitle = itemView.findViewById(R.id.hoge_title_text_view);
hogeContents = itemView.findViewById(R.id.hoge_contents_text_view);
}
}
/**
*ViewHolder-Erstellungsmethode
*Nur zuerst angerufen.
*Hier wird der ViewHolder, der mithilfe der ViewHolder-Layoutdatei als Inflation generiert wurde, an RecyclerView zurückgegeben.
*/
@NonNull
@Override
public MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_holder_main, parent, false);
return new MainViewHolder(view);
}
/**
*Binden Sie ViewHolder und RecyclerView
*Schreiben Sie hier die Verarbeitung, die Sie gemeinsam für eine Ansichtszeile ausführen möchten. Diesmal habe ich nur den Text eingestellt.
*/
@Override
public void onBindViewHolder(@NonNull MainViewHolder holder, int position) {
RowData rowData = this.rowDataList.get(position);
holder.hogeTitle.setText(rowData.hogeTitle);
holder.hogeContents.setText(rowData.hogeContents);
}
/**
*Anzahl der Zeilen in der Liste
*/
@Override
public int getItemCount() {
return rowDataList.size();
}
}
Erstellen Sie eine RecyclerView mit Aktivität. Stellen Sie den Adapter nach der Generierung ein.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.main_recycler_view);
//Aktivieren Sie die Einstellung, die die Layoutgröße von RecyclerView nicht ändert
//Einstellungen zur Leistungsverbesserung.
recyclerView.setHasFixedSize(true);
//Legen Sie layoutManager in RecyclerView fest.
//Abhängig vom Typ dieses layoutManager können Sie "einspaltige Liste" oder "zweispaltige Liste" auswählen.
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//Generieren Sie einen Adapter und legen Sie ihn in RecyclerView fest
RecyclerView.Adapter mainAdapter = new MainAdapter(createRowData());
recyclerView.setAdapter(mainAdapter);
}
private List<RowData> createRowData() {
List<RowData> dataSet = new ArrayList<>();
int i = 0;
while (i < 20) {
RowData data = new RowData();
data.hogeTitle = "HogeTitle!!";
data.hogeContents = "HogeHogeHogeHogeHogeHogeHogeHogeHogeHogeHoge";
dataSet.add(data);
i = i + 1;
}
return dataSet;
}
class RowData {
Image hogeImage;
String hogeTitle;
String hogeContents;
}
}
Ich werde versuchen, es zu bauen, wenn ich es soweit schaffen kann.
Es ist fertig.
Recommended Posts