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
    评论
RecyclerViewAdapter是一个用于加载RecyclerView子项的布局并返回ViewHolder对象的适配器。它继承自RecyclerView.Adapter类,并实现了onBindViewHolder(ViewHolder viewHolder, int i)方法,该方法用于绑定数据到ViewHolder上。\[1\] 在RecyclerViewAdapter中,当适配器的数据发生变化时,可以通过观察者模式来通知观察者。观察者是一个继承自抽象类AdapterDataObserver的类,它可以观察适配器的变化并做出相应的对策。为了实现观察者模式,RecyclerViewAdapter使用了AdapterDataObserverable来通知观察者适配器的变化。\[2\] 观察者AdapterDataObserver中定义了多个方法,这些方法对应了Adapter中的notify相关方法。当适配器调用notify相关方法时,会触发相应的观察者方法。通过这种方式,观察者可以及时响应适配器的变化并进行相应的处理。\[3\] #### 引用[.reference_title] - *1* [android之RecyclerView.Adapter介绍](https://blog.csdn.net/u012739527/article/details/124011765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【RecyclerViewRecyclerViewAdapter](https://blog.csdn.net/qq_29266921/article/details/80630432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值