RecyclerView的Adapter最佳实战

在使用RecyclerView的时候,发现同事在使用上很原生态。
什么意思呢,原生态大概就是下面这样。

public class UserAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private String[] mDataset;  

    public MyAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) { 
        View v = LayoutInflater.from(parent.getContext())
                               .inflate(R.layout.my_text_view, parent, false); 
        ViewHolder vh = new ViewHolder(v);
        return vh;
    } 

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) { 
        holder.mTextView.setText(mDataset[position]); 

    } 

    @Override
    public int getItemCount() {
        return mDataset.length;
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public ViewHolder(TextView v) {
            super(v);
            mTextView = v;
        }
    }
}

原始太于使用的Adapter很原生态
他实际写的不只这些,只是太难以入目,就没粘贴出来,写一个这样的简单的示意下。

看起来似乎没什么问题。

  1. 我们的adapter的数据经常是需要修改的把?
  2. 我们的adapter像这样的还需要很多个吧?
  3. 我们item点击后是需要回调来做进一步处理的把?

。。。。。。。(不要告诉我你不需要就好了)

像这样的问题,我们就需要对这样的代码做进一步封装啊!!!
怎么搞?

同样的,我们修改后的Adapter是这样的

升级后

public class UserListAdapter extends RecycleAdapterBase<UserBean, UserListAdapter.ViewHolder> {

    public UserListAdapter() {
    }

    @Override
    public ViewHolder
    onCreateViewHolder(ViewGroup parent, int viewType) {
        final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_user_info, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        UserBean userBean = getObject(position);
        holder.tvName.setText(userBean.getName());
        holder.tvSex.setText(userBean.getSex());
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView tvName;
        private TextView tvSex;

        public ViewHolder(View itemView) {
            super(itemView);
            tvName = (TextView) itemView.findViewById(R.id.tv_name);
            tvSex = (TextView) itemView.findViewById(R.id.tv_sex);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (onClickListener != null) {
                onClickListener.onItemClick(getAdapterPosition(), getObject(getAdapterPosition()));
            }
        }
    }

}

需要特别关注的是这么一句 RecycleAdapterBase<UserBean, UserListAdapter.ViewHolder>
是的,这个我们的Base类。利用泛型,封装基础的操作。

BaseAdapter

public abstract class RecycleAdapterBase<T, A extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<A> {

    public List<T> mList = new ArrayList<>();
    public onItemClickListener<T> onClickListener;

    @Override
    public int getItemCount() {
        if (mList == null)
            return -1;
        return mList.size();
    }


    /**
     * @param list
     */
    public void appentToList(List<T> list) {
        mList.addAll(list);
        notifyDataSetChanged();
        list = null;
    }

    public void appentToList(T t) {
        mList.add(t);
        notifyDataSetChanged();
    }

    public void appentToListFirst(T t) {
        mList.add(0, t);
        notifyDataSetChanged();
    }

    public void appentToListFirst(List<T> list) {
        mList.addAll(0, list);
        notifyDataSetChanged();
        list = null;
    }

    /**
     * @param list
     */
    public void changeList(List<T> list) {
        mList = list == null ? new ArrayList<T>() : list;
        notifyDataSetChanged();
    }

    /**
     * 清空列表
     */
    public void clearList() {
        mList.clear();
        notifyDataSetChanged();
    }

    /**
     * 删除列表中某一项
     */
    public void removeObject(T t) {
        mList.remove(t);
        notifyDataSetChanged();
        t = null;
    }

    public void updateObject(T t) {
        mList.set(mList.indexOf(t), t);
        notifyDataSetChanged();
    }

    public void setOnClickListener(onItemClickListener<T> onClickListener) {

        this.onClickListener = onClickListener;
    }

    public interface onItemClickListener<T> {

        public void onItemClick(int position, T object);
    }

    protected T getObject(int position) {

        if (mList != null && mList.size() > position) {
            return mList.get(position);
        }
        return null;
    }
}

这样的代码,看起来才么么哒!

配套的代码demo地址也有了,欢迎下载
http://download.csdn.net/detail/f112122/9294349

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值