[JAVA] [Android] Implementierung von SideVolling ListView mit RecyclerView

Was ich gemacht habe

ListView ist unter Android bekannt, kann jedoch nicht horizontal gescrollt werden. Daher erstellen wir ein Widget wie ListView, das RecyclerView erbt und horizontal scrollt.

Was ist RecyclerView?

Ein Widget, das mehrere Ansichten anzeigt. Es ist ziemlich flexibel, so dass die meisten Dinge damit gemacht werden können. Weitere Informationen finden Sie unter [Android] Grundlegende Implementierung von RecyclerView.

Fertiges Produkt

HorizontalListView.java



import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

public class HorizontalListView extends RecyclerView{

    public interface OnItemClickListener{
        void onItemClick(View view, int position);
    }

    public HorizontalListView(Context context){
        super(context);
        initialize(context);
    }

    public HorizontalListView(Context context, AttributeSet set){
        super(context, set);
        initialize(context);
    }

    public HorizontalListView(Context context, AttributeSet set, int defaultAttr){
        super(context, set, defaultAttr);
        initialize(context);
    }

    private void initialize(Context context){
        LinearLayoutManager manager = new LinearLayoutManager(context);
        manager.setOrientation(LinearLayoutManager.HORIZONTAL);
        setLayoutManager(manager);
    }

    private OnItemClickListener mListener;

    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;
        Adapter adapter = getAdapter();
        if ( adapter instanceof ArrayAdapter ){
            ArrayAdapter a = (ArrayAdapter)adapter;
            a.mListener = this.mListener;
        }
    }

    @Override
    public void setAdapter(RecyclerView.Adapter adapter){
        super.setAdapter(adapter);
        if ( adapter instanceof ArrayAdapter ){
            ArrayAdapter a = (ArrayAdapter)adapter;
            a.mListener = this.mListener;
        }
    }

    @Override
    protected void onDetachedFromWindow(){
        super.onDetachedFromWindow();
        setOnItemClickListener(null);
        setAdapter(null);
        setLayoutManager(null);
    }

    private static class SimpleViewHolder extends ViewHolder{
        private SimpleViewHolder(View view){
            super(view);
        }
    }

    public static abstract class ArrayAdapter<E> extends RecyclerView.Adapter<ViewHolder> {

        public ArrayAdapter(List<E> list){
            mDataList = new ArrayList<>(list.size());
            mViews = new ArrayList<>(list.size());
            mDataList.addAll(list);
        }

        private List<E> mDataList;
        private OnItemClickListener mListener;
        private List<View> mViews;

        /**
         *Ansicht als Listenelement instanziieren
         * @param parent
         * @return null not acceptable
         */
        public abstract View getView(ViewGroup parent);

        /**
         *Reflektieren Sie die in der Liste in der Ansicht angezeigten Daten
         * @param view Ansicht des Reflexionsziels
         * @Parameterdaten Zu reflektierende Daten{@link #getItem(int)}Kann aber erhalten werden
         * @param position Position auf der Liste
         */
        public abstract void onBindView(View view, E data, int position);

        @Override
        public final ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
            return new SimpleViewHolder(getView(parent));

        }

        @Override
        public final void onBindViewHolder(final ViewHolder holder, int position){

            final View view = holder.itemView;
            E data = getItem(position);
            onBindView(view, data, position);

            mViews.add(holder.itemView);
            holder.itemView.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v){
                    if ( mListener != null ){
                        mListener.onItemClick(view, holder.getAdapterPosition());
                    }
                }
            });
        }

        @Override
        public void onDetachedFromRecyclerView(RecyclerView recyclerView){
            super.onDetachedFromRecyclerView(recyclerView);
            for ( View view : mViews ) view.setOnClickListener(null);
            mViews = null;
            mListener = null;
            mDataList = null;
        }

        @Override
        public final int getItemCount(){
            return mDataList.size();
        }

        public E getItem(int position){
            return mDataList.get(position);
        }
    }
}

Implementierungsbeschreibung

Realisierung des horizontalen Bildlaufs

Sie müssen lediglich den LinearLayoutManager mit der horizontalen Ausrichtung auf RecyclerView einstellen.

private void initialize(Context context){
    LinearLayoutManager manager = new LinearLayoutManager(context);
    manager.setOrientation(LinearLayoutManager.HORIZONTAL);
    setLayoutManager(manager);
}

Vorbereitung des Adapters

Wie ListView benötigt RecyclerView einen Adapter, um die Daten zu verwalten und die Ansicht anzuzeigen. Daher haben wir HorizontalListView.ArrayAdapter vorbereitet, indem wir RecyclerView.Adapter geerbt haben. Die folgenden zwei sollten bei der Verwendung implementiert werden.

    public abstract View getView(ViewGroup parent);

    public abstract void onBindView(View view, E data, int position);

Blasen Sie die für die Anzeige verwendete Ansicht mit getView (ViewGroup) auf und spiegeln Sie den Inhalt der Daten E wider, um sie mit onBindView (View, E, int) anzuzeigen. Bei der Verwendung von ListView habe ich eine ähnliche API angegeben, damit es auf die gleiche Weise betrieben werden kann wie das Anpassen des Layouts mit einem Adapter, der android.widget.ArrayAdapter erbt.

Rückruf vorbereiten

Wie bei ListView möchte ich einen Rückruf, der mich benachrichtigt, wenn auf ein Element der Liste geklickt wird. Lass es uns machen.

public interface OnItemClickListener{
    void onItemClick(View view, int position);
}

Benachrichtigt die angeklickte Ansicht und Anzeigeposition. Setzen Sie OnClickListener als Implementierung auf die Ansicht, die der zuvor erstellte HorizontalListView.ArrayAdapter mit getView (ViewGroup) erfasst und anzeigt, und leiten Sie den empfangenen Rückruf weiter. Beachten Sie jedoch, dass dies nur funktioniert, wenn der mit RecyclerView # setAdapter () festgelegte Adapter HorizontalListView.ArrayAdapter ist.

Recommended Posts

[Android] Implementierung von SideVolling ListView mit RecyclerView
Einfache Implementierung des Durchsuchens von Android-Dateien
Implementierung der Validierung mit regulären Ausdrücken
Implementierung der Benutzerauthentifizierungsfunktion mit devise (2)
Implementierung der Benutzerauthentifizierungsfunktion mit devise (1)
Implementierung von Registerkarten mit TabLayout und ViewPager
Implementierung der Benutzerauthentifizierungsfunktion mit devise (3)
[Rails] Implementierung der Suchfunktion mit Gem's Ransack
Minimaler Vorlagencode für die Android-Entwicklung, RecyclerView-Implementierung
[Android] [Java] Verwalten Sie den Status der CheckBox von ListView
[FCM] Implementierung der Nachrichtenübertragung mit FCM + Spring Boot
[Rails] Implementierung der Bildvergrößerungsfunktion mit Lightbox2
Übersetzen Sie mit der Microsoft Translator Text API unter Android ~ Implementierung ~
[Rails] Implementierung des PV-Nummernrankings mit Impressionist
[Rails] Implementierung einer Bild-Diashow mit Bootstrap 3
Geschichte der Testautomatisierung mit Appium [Android / Java]
Implementierung der Google-Anmeldung mithilfe der Google OAuth 2.0-Authentifizierung (Server Edition)
[Android] Anzeige von Eingabekandidaten über das Listen-Popup-Fenster
<Android> Ändern Sie die Hintergrundfarbe der List-Zeile von ListView
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Vorbereitung"
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der "Seed Edition" der Vorfahren
Implementierung der Suchfunktion
Beispiel für die Verwendung von vue.config.js
Angewandte Implementierung von Chat-Space
Zusammenfassung der Verwendung von FragmentArgs
Implementierung der Pagenationsfunktion
Zusammenfassung der Verwendung von DBFlow
Implementieren einer Datenbank mit Realm
Definition von Android-Konstanten
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Edit Form Edition"
So implementieren Sie den In-App-Kauf einfach über den Itemstore <Implementierung: Android>
[Rails] Implementierung der automatischen Adresseneingabe mit jpostal und jp_prefecture
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Erstellungsformular"