ListView ist unter Android bekannt, kann jedoch nicht horizontal gescrollt werden. Daher erstellen wir ein Widget wie ListView, das RecyclerView erbt und horizontal scrollt.
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.
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);
}
}
}
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);
}
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.
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