Ich habe RecyclerView im Internet durchsucht und den Beispielcode erstellt, der herauskam, aber es gelang mir überhaupt nicht. Wenn nicht mehr viel übrig ist, habe ich beschlossen, es beizubehalten, und daher die Recycer-Ansicht zusammengefasst. (Und ich muss es bei der Arbeit benutzen)
In der Android-Entwicklung habe ich bis zu ListView implementiert. Es scheint jedoch, dass ListView in den letzten Android-Versionen nicht viel verwendet wird und RecyclerView häufig verwendet wird. Die Implementierung in ListView war nicht so schwierig, aber ich konnte keinen anständigen RecyclerView-Beispielcode im Internet finden, also habe ich beschlossen, meine eigene Vorlage zu erstellen. RecyclerView ist wie eine höhere Version von ListView, und für mich ist es nur ein Bild wie UICollectionView von iOS. Es scheint für die Anzeige einer großen Menge von Listendaten geeignet zu sein, und es wurde so erstellt, dass es durch Wiederverwendung von Bildschirmteilen effizient gescrollt werden kann.
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", "Gebratenes Menü");
menu.put("price", 800);
menu.put("desc", "Gebratene Jungvögel mit Salat-, Reis- und Misosuppe.");
menuList.add(menu);
menu = new HashMap<>();
menu.put("name", "Hamburger Set Mahlzeit");
menu.put("price", 850);
menu.put("desc", "Handgemachter Hamburger mit Salat-, Reis- und Misosuppe.");
menuList.add(menu);
//
menu = new HashMap<>();
menu.put("name", "");
menu.put("price", 850);
menu.put("desc", "");
menuList.add(menu);
menu = new HashMap<>();
menu.put("name", "");
menu.put("price", 1000);
menu.put("desc", "");
menuList.add(menu);
menu = new HashMap<>();
menu.put("name", "");
menu.put("price", 750);
menu.put("desc", "Ingwer-gegrillte Mahlzeit Ingwer-gegrillter geriebener Ingwer mit Salat, Reis und Miso-Suppe. Steak Set Mahlzeit Inländisches Rindersteak mit Salat, Reis und Miso-Suppe. Gebratenes Gemüse Set Mahlzeit Saisonales gebratenes Gemüse wird von Salat, Reis und Miso-Suppe begleitet.");
menuList.add(menu);
menu = new HashMap<>();
menu.put("name", "Tonkatsu stellte Mahlzeit ein");
menu.put("price", 900);
menu.put("desc", "Lenden-Tonkatsu mit Salat-, Reis- und Miso-Suppe.");
menuList.add(menu);
menu = new HashMap<>();
menu.put("name", "Gehackte und festgelegte Mahlzeit");
menu.put("price", 850);
menu.put("desc", "Handgemachtes gehacktes Schnitzel mit Salat, Reis und Miso-Suppe.");
menuList.add(menu);
menu = new HashMap<>();
menu.put("name", "Hühnchen Schnitzel Set Mahlzeit");
menu.put("price", 900);
menu.put("desc", "Ein herzhaftes Hühnerschnitzel mit Salat, Reis und Miso-Suppe.");
menuList.add(menu);
menu = new HashMap<>();
menu.put("name", "Krokettenmahlzeit");
menu.put("price", 850);
menu.put("desc", "Hokkaido-Kartoffelkrokette mit Salat-, Reis- und Miso-Suppe.");
menuList.add(menu);
menu = new HashMap<>();
menu.put("name", "Gegrilltes Fischgericht");
menu.put("price", 850);
menu.put("desc", "Salz gegrillter Aal mit Salat, Reis und Miso-Suppe.");
menuList.add(menu);
menu = new HashMap<>();
menu.put("name", "Gegrilltes Fleischmenü");
menu.put("price", 950);
menu.put("desc", "Ein Salat, Reis und Miso-Suppe sind an das gegrillte Fleisch gebunden.");
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;
}
//Methode zum Erstellen eines Viewholder-Objekts
@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;
}
//Methode zum Zuweisen der Daten, die jedem Bildschirmteil im Ansichtshalter angezeigt werden sollen
@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);
}
//Methode zur Rückgabe der Datenanzahl
@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 {}
Sie müssen eine ViewHolder-Klasse erstellen, die von der RecyclerView.ViewHolder-Klasse erbt. Ist es die Erzeugung einer View-Klasse wie "UITableViewCell" in einem iOS-ähnlichen Bild? Es wird gesagt, dass das Objekt, das die Bildschirmteile jedes Elements enthält, als Ansichtshalter bezeichnet wird.
RecyclerView.java
private class RecyclerListAdapter extends RecyclerView.Adapter<RecyclerListViewHolder> {}
Dies liegt daran, dass RecyclerView keinen eigenen Adapter hat. Sie müssen ihn daher selbst anpassen und implementieren. Da recyclerView.Adapter eine abstrakte Klasse ist, scheint es notwendig zu sein, die folgenden drei Methoden zu implementieren.
onCreateViewHolder: Methode zum Erstellen eines Viewholder-Objekts onBindViewHolder: Eine Methode zum Einfügen von Anzeigedaten in jeden Bildschirmteil im Ansichtshalter getItemCount: Methode, die die Anzahl der Daten zurückgibt
Auf dem Screenshot scheint es, dass im Fall von Recyclerview eine Trennlinie wie UITableViewCell nicht standardmäßig implementiert ist. Zum Einfügen der Trennlinie ist eine separate Klasse "DividerItemDecoration" erforderlich.
Um es zu implementieren, fügen Sie einfach die folgenden zwei Zeilen am Ende der Methode "protected void onCreate (Bundle savedInstanceState)" der Aktivität hinzu.
RecyclerView.java
//Erstellen Sie ein Objekt für die Trennlinie
DividerItemDecoration decoration = new DividerItemDecoration(ScrollListActivity.this, layout.getOrientation());
lvMenu.addItemDecoration(decoration);
Die Trennlinie wird nun angezeigt.
Und wenn Sie tatsächlich auf RecyclerView tippen, um eine Aktion auszuführen
RecyclerView.java
private class ItemClickListener implements View.OnClickListener
Einfach umsetzen. Lassen Sie uns den Prozess in diese private Klassenmethode schreiben und an der folgenden Stelle festlegen.
RecyclerView.java
//Methode zum Erstellen eines Viewholder-Objekts
@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()); // <-Hier hinzufügen
RecyclerListViewHolder holder = new RecyclerListViewHolder(view);
return holder;
}
Das Klickereignis reagiert jetzt.
Recommended Posts