ListView est familier sur Android, mais il ne peut pas faire défiler horizontalement. Par conséquent, nous allons créer un widget comme ListView qui hérite de RecyclerView et défile horizontalement.
Un widget qui affiche joliment plusieurs vues. C'est assez flexible, donc la plupart des choses peuvent être faites avec cela. Pour plus de détails, voir [Android] Implémentation de base de 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;
/**
*Instancier la vue en tant qu'élément de liste
* @param parent
* @return null not acceptable
*/
public abstract View getView(ViewGroup parent);
/**
*Refléter les données affichées dans la liste dans View
* @vue param Vue de la destination de réflexion
* @param data Données à refléter{@link #getItem(int)}Mais peut être obtenu
* @param position Position sur la 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);
}
}
}
Tout ce que vous avez à faire est de définir LinearLayoutManager avec l'orientation horizontale sur RecyclerView.
private void initialize(Context context){
LinearLayoutManager manager = new LinearLayoutManager(context);
manager.setOrientation(LinearLayoutManager.HORIZONTAL);
setLayoutManager(manager);
}
Comme ListView, RecyclerView nécessite un adaptateur pour gérer les données et la vue à afficher. Par conséquent, nous avons préparé HorizontalListView.ArrayAdapter en héritant de RecyclerView.Adapter. Les deux suivants doivent être implémentés lors de l'utilisation.
public abstract View getView(ViewGroup parent);
public abstract void onBindView(View view, E data, int position);
Gonflez la vue utilisée pour l'affichage avec getView (ViewGroup) et reflétez le contenu des données E pour afficher avec onBindView (View, E, int). Lors de l'utilisation de ListView, je lui ai donné une API similaire afin qu'elle puisse être utilisée de la même manière que la personnalisation de la mise en page avec un adaptateur qui hérite de android.widget.ArrayAdapter.
Comme ListView, je veux un rappel qui me prévient lorsqu'un élément de la liste est cliqué. Faisons-le.
public interface OnItemClickListener{
void onItemClick(View view, int position);
}
Notifie la vue et la position d'affichage cliquées. En tant qu'implémentation, définissez OnClickListener sur la vue que l'HorizontalListView.ArrayAdapter créée précédemment acquiert et affiche avec getView (ViewGroup) et relaie le rappel reçu. Cependant, notez que cela ne fonctionnera que si l'adaptateur défini avec RecyclerView # setAdapter () est HorizontalListView.ArrayAdapter.
Recommended Posts