Android RecyclerView相关简化

找到sdk目录下的: sdk/extras/android/m2repository/com/android/support/recyclerview-v7/21.0.0/recyclerview-v7-21.0.0.aar

解压出classes.jar,  改名recyclerview-v7-21.0.0.jar。放入libs目录中,就能使用android.support.v7.widget.RecyclerView


viewHolder

import android.content.Context;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.ImageView;  
import android.widget.TextView;  
  
  
/** 
 * author : stone 
 * email  : aa86799@163.com 
 * time   : 15/10/11 14 38 
 */  
public class BaseRecyclerViewHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener, View.OnLongClickListener{
  
    private View mItemView;  
    private SparseArray<View> mViews;  //管理listView-item中的view
    private OnItemClickListener onItemClickListener;

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

        boolean onItemLongClick(View view, int position);
    }

    private BaseRecyclerViewHolder(@NonNull View itemView,
                                   @Nullable OnItemClickListener onItemClickListener) {
        super(itemView);
//        this.mItemView.setTag(this);
        this.mItemView = itemView;
        this.mViews = new SparseArray<View>();
        this.onItemClickListener = onItemClickListener;

        this.mItemView.setOnClickListener(this);
        this.mItemView.setOnLongClickListener(this);
    }
  
    private BaseRecyclerViewHolder(Context context, int layoutId, ViewGroup parent,
                                   @Nullable OnItemClickListener onItemClickListener) {
        this(LayoutInflater.from(context).inflate(layoutId, parent), onItemClickListener);
    }  
  
    public static BaseRecyclerViewHolder getInstance(Context context, int layoutId, ViewGroup parent,
                                                     @Nullable OnItemClickListener onItemClickListener) {
        return new BaseRecyclerViewHolder(context, layoutId, parent, onItemClickListener);
    }

    @Override
    public void onClick(View v) {
        if (onItemClickListener != null){
            onItemClickListener.onItemClick(itemView, getAdapterPosition());

        }
    }

    @Override
    public boolean onLongClick(View v) {
        if (onItemClickListener != null){
            //getAdapterPosition 返回由item-ViewHolder表示的adapter中的位置
            return onItemClickListener.onItemLongClick(itemView, getAdapterPosition());
        }
        return false;
    }

    public <T extends View> T getView(int viewId) {  
        View view = mViews.get(viewId);  
        if (view == null) {  
            view = mItemView.findViewById(viewId);  
            mViews.put(viewId, view);  
        }  
        return (T) view;  
    }  
  
    public <T> void setTag(int viewId, T tag) {  
        getView(viewId).setTag(tag);  
    }  
  
    public <T> T getTag(int viewId) {  
        return (T) getView(viewId).getTag();  
    }  
  
    /*------------------------  设置view属性(以后扩展) --------------------------------*/  
  
    public BaseRecyclerViewHolder setText(int viewId, String text) {
        ((TextView) getView(viewId)).setText(text);  
        return this;  
    }  
  
    public BaseRecyclerViewHolder setText(int viewId, int resId) {//R.string.
        ((TextView) getView(viewId)).setText(resId);  
        return this;  
    }  
  
    public BaseRecyclerViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
        ((ImageView) getView(viewId)).setImageBitmap(bitmap);  
        return this;  
    }  
  
    public BaseRecyclerViewHolder setImageResource(int viewId, int resId) {
        ((ImageView) getView(viewId)).setImageResource(resId);  
        return this;  
    }  
  
} 


adapter

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;

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

/**
 * author : stone
 * email  : aa86799@163.com
 * time   : 15/10/11 14 22
 */
public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<BaseRecyclerViewHolder> {

    protected List<T> mDatas;
    protected Context mContext;
    private int mLayoutID;
    private BaseRecyclerViewHolder.OnItemClickListener mOnItemClickListener;

    public BaseRecyclerViewAdapter(Context context, int layoutID, List<T> datas) {
        this.mContext = context;
        this.mLayoutID = layoutID;
        this.mDatas = datas == null ? new ArrayList<T>() : datas;
    }

    public void setOnItemClickListener(BaseRecyclerViewHolder.OnItemClickListener onItemClickListener) {
        this.mOnItemClickListener = onItemClickListener;
    }

    @Override
    public BaseRecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        switch (viewType) {
            //根据viewType 创建不同的ViewHolder
            default:
                break;
        }
        return BaseRecyclerViewHolder.getInstance(mContext, mLayoutID, null, mOnItemClickListener);
    }

    @Override
    public void onBindViewHolder(final BaseRecyclerViewHolder holder, final int position) {
        onBindViewHolderSetData(holder, position);
    }

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

    public T getItem(int position) {
        return (T) mDatas.get(position);
    }

    public abstract void onBindViewHolderSetData(@NonNull BaseRecyclerViewHolder holder, int position);
}

RecyclerView.Adapter内部管理RecyclerView.ViewHolder


使用定义的adapter

/**
 * author : stone
 * email  : aa86799@163.com
 * time   : 15/9/22 17 05
 */
public final class RecommendRecyclerViewAdapter extends BaseRecyclerViewAdapter<RecommendData> {


    public RecommendRecyclerViewAdapter(Context context, int layoutID, List<RecommendData> datas) {
        super(context, layoutID, datas);
    }

    @Override
    public void onBindViewHolderSetData(BaseRecyclerViewHolder holder, int position) {
        RecommendData data = getItem(position);
        //TextView tv = holder.getView(R.id.tv_title);
        //tv.setText(data.getTitle());
        holder.setText(R.id.tv_title, data.getTitle());
    }
}


在使用adapter时,传入相应数据即可
一些方法:
mRecyclerView.setHasFixedSize(true); //固定size以优化
mLayoutManager = new LinearLayoutManager(this); //线性纵向
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); //横向
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);  //纵向

 //网格列表。HORIZONTAL 横向滚动显示内容, VERTICAL纵向;3表示行数; true 表示,将layout内容反转        
mLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, true);
       
mLayoutManager = new GridLayoutManager(this, 1, GridLayoutManager.VERTICAL, false); //数字表示行数       
mLayoutManager = new GridLayoutManager(this, 2, GridLayoutManager.HORIZONTAL, false);

//交错网格列表
mLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL);
mLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL);

mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);


//设置动画. DefaultItemAnimator是系统的一个默认实现. adapter.notifyItem方法会触发动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 


adapter.notify方法:
notifyDataSetChanged();  //不会触发动画
notifyItemRangeChanged(int positionStart, int itemCount); //通知内容变化,需要刷新
notifyItemChanged(int position); 
notifyItemChanged();
notifyItemRemoved(int position); //删除指定位置的item
notifyItemInserted(int position); //添加item到指定位置


//设置item的分隔样式,系统没有默认实现,官方例子中有一个:DividerItemDecoration

mRecyclerView.addItemDecoration(ItemDecoration decor);


a. 可以自定义一个LayoutManager, 需要extends RecyclerView.LayoutManager,以显示自定风格的布局
b. RecyclerView本身没有onItemClick的监听,需要自行添加:在重写它的ViewHolder时,有方法拿到position,可以拿到
   当前位置,所以就可以添加一个itemClick的回调监听

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值