• RecyclerView.Adapter


    RecyclerView无需多说,是用于替代ListView的新控件。它的适配器在于灵活。

    现在有一个需求:需要RecyclerView的item支持点击事件,并且下拉到最后时,显示ProgressBar表明正在加载,并加载更多数据。

    1.点击事件的实现

    先定义一个接口

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

    适配器构造函数,增加Click对象的传递

    1  private RecyclerViewClickListener mClickListener;
    2 
    3 public PostListAdapter(RequestQueue rQueue, RecyclerViewClickListener clickListener) {
    4 
    5         this.mClickListener = clickListener;
    6     }

    创建Item的Holder对象时,传递Click对象到Holder的构造函数中(以下仅保留关键代码)

     @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     NormalAnswerHolder holder = new NormalAnswerHolder(
                        LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home, parent, false), mClickListener);
                return holder;
    
            }
        }

    Holder类中处理Click事件

     1     class NormalAnswerHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
     2         private RecyclerViewClickListener mClickListener;
     3         private TextView textViewName;
     4         private TextView textViewCount;
     5         private TextView textViewExcerpt;
     6 
     7         public NormalAnswerHolder(View view, RecyclerViewClickListener clickListener) {
     8             super(view);
     9             this.mClickListener = clickListener;
    10             textViewName = (TextView) view.findViewById(R.id.tv_name);
    11             textViewCount = (TextView) view.findViewById(R.id.tv_count);
    12             textViewExcerpt = (TextView)view.findViewById(R.id.tv_excerpt);
    13 
    14             itemView.setOnClickListener(this);
    15         }
    16 
    17 
    18         /**
    19          * Click event.
    20          *
    21          * @param v
    22          */
    23         @Override
    24         public void onClick(View v) {
    25             if (mClickListener != null) {
    26                 mClickListener.onItemClick(v, getPosition());
    27             }
    28         }
    29     }

    注意:Holder类的构造函数中获得Click对象后,最基本的需要对itemView设置点击事件。如果需要对item中的subview设置单独的点击事件,就对相应的view设置点击事件即可。

    Click事件的调用:

     1 mAdapter = new PostListAdapter(mQueue, new RecyclerViewClickListener() {
     2                 @Override
     3                 public void onItemClick(View view, int position) {
     4                     Intent intent = new Intent(getActivity(), ArticleDetailActivity.class);
     5                     Post post = mAdapter.getPost(position);
     6                     if (post == null) return;
     7                     intent.putExtra(Define.KEY_DATE, post.getDate());
     8                     intent.putExtra(Define.KEY_NAME, post.getName());
     9                     startActivity(intent);
    10                 }
    11             });

    注意:如果需要针对不同subview的点击事件处理,在onItemClick中就需要自行依据view类型或者其他tag类标识进行区别自行处理。

    2.底部Progressbar加载显示。类似于ListView的适配器,普通情况显示正常item,判断加载的item是否为当前最后一个,如果是当前最后一个,就显示为自定义的Footview,并通知进行数据加载,数据加载完成后刷新。

    首先需要定义两种item的Holder,正常的和底部的,然后在适配器中进行判断。

        private final int TYPE_ITEM = 0;
        private final int TYPE_FOOTER = 1;

    定义两个值用于区别不同的holder。

     @Override
        public int getItemViewType(int position) {
            if (position + 1 == getItemCount()) {
                return TYPE_FOOTER;
            } else {
    
                    return TYPE_ITEM;
            }
        }

    重载getItemViewType,通过当前位置判断是否要加载FootView。

     1 @Override
     2     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     3         if (viewType == TYPE_FOOTER) {
     4             FooterViewHolder holder = new FooterViewHolder(
     5                     LayoutInflater.from(parent.getContext()).inflate(R.layout.footerview, parent, false));
     6             return holder;
     7         }else{
     8             NormalAnswerWithDateHolder holder = new NormalAnswerWithDateHolder(
     9                     LayoutInflater.from(parent.getContext()).inflate(R.layout.item_homewithdate, parent, false), mClickListener);
    10             return holder;
    11         }
    12     }

    依据当前不同的类型,加载不同的ViewHolder

    触发加载更多,目前只想到利用RecyclerView的setOnScrollListener事件来判断当前滚动的item位置。

     1 mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
     2             @Override
     3             public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
     4                 super.onScrollStateChanged(recyclerView, newState);
     5                 if (newState == RecyclerView.SCROLL_STATE_IDLE
     6                         && mLinearLayoutManager.findLastVisibleItemPosition() + 1
     7                         == mAdapter.getItemCount()) {
     8                     requestOldData();
     9                 }
    10             }
    11         });

    完。

  • 相关阅读:
    go视频提取音频
    ffmpeg常用命令 转
    mac安装homebrew
    go读取键盘输入两种方式
    静态方法加锁,和非静态方法加锁区别
    Java类锁和对象锁实践和内部私有锁关联
    Java基础】并发
    一步一步掌握线程机制(六)---Atomic变量和Thread局部变量
    compareAndSet() 注意点
    Java JUC之Atomic系列12大类实例讲解和原理分解
  • 原文地址:https://www.cnblogs.com/dev2007/p/5159695.html
Copyright © 2020-2023  润新知