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 });
完。