[JAVA] Minimaler Vorlagencode für die Android-Entwicklung, RecyclerView-Implementierung

Ich habe versucht zusammenzufassen, wie RecyclerView implementiert wird

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)

Was ist RecyclerView?

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.

Informationen zum Quellcode für die Vorlage

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>

Informationen zu wichtigen Klassenmethoden für die Verwendung von RecyclerView

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

Über Screenshots

Screenshot_1530530217.png

Screenshot_1530530220.png

Über die Implementierung von Teilern wie UITableViewCell

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.

Informationen zu Klickereignissen

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.

Nachschlagewerke

Grundlegende und angewandte Fähigkeiten entwickeln! Lehrbuch zur Entwicklung von Android-Apps Praktisch, um nicht Entwickler zu werden

Recommended Posts

Minimaler Vorlagencode für die Android-Entwicklung, RecyclerView-Implementierung
Erste Android-Entwicklung für vielbeschäftigte Menschen
Eine Sammlung von Bibliotheken, die für die Android-Entwicklung nützlich sind
Hinweise für Anfänger in der Android-Anwendungsentwicklung
Lernrichtlinien für die Android-Entwicklung für iOS-Ingenieure
[Android] Implementierung von SideVolling ListView mit RecyclerView
Beispielcode für die Singleton-Implementierung mit enum
Vorbereitung für die Android-Entwicklung von POCOPHONE f1
Ein Memorandum für Anfänger der Android-Anwendungsentwicklung
Android Studio-Entwicklung zum ersten Mal (für Anfänger)
Android-Entwicklung app_preparation