1、用AS开发,在build.gradle中添加依赖
dependencies { ... compile 'com.android.support:recyclerview-v7:21.0.3' }
2、用Eclipse开发,添加jar包
3、在xml布局文件中添加一个recycleview的布局
<android.support.v7.widget.RecyclerView
android:id="@+id/gridview_dynamic2"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
4、activity的oncreate方法中添加如下关键代码
RecyclerView gridView = (RecyclerView) findViewById(R.id.gridview_dynamic2); gridView.setHasFixedSize(false); StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL); gridView.setLayoutManager(staggeredGridLayoutManager); adapter = new Dynamic2Adapter(this); gridView.setAdapter(adapter);
5、创建recycleview的数据适配器
public class Dynamic2Adapter extends RecyclerView.Adapter<Dynamic2Adapter.ViewHolder> implements View.OnClickListener { private LayoutInflater layoutInflater; private List<Article> _items; public Dynamic2Adapter(Context context) { this(context, null); } public Dynamic2Adapter(Context context, List<Article> items) { layoutInflater = LayoutInflater.from(context); _items = items; if (_items == null) { _items = new ArrayList<Article>(); } } public List<Article> getItems() { if (_items == null) { _items = new ArrayList<Article>(); } return _items; } public void setItems(List<Article> items) { this._items = items; } @Override public Dynamic2Adapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = layoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_dynamic, viewGroup, false); ViewHolder vh = new ViewHolder(view); view.setOnClickListener(this); return vh; } @Override public void onBindViewHolder(Dynamic2Adapter.ViewHolder holder, int position) { Article article = (Article) getItem(position); if (article != null) { holder.itemView.setTag(article); String picUrl = article.getPicUrl(); if (picUrl != null) { UrlImageViewHelper.setUrlDrawable(holder.dynamic_image, picUrl); holder.dynamic_pic.setVisibility(View.VISIBLE); } else { holder.dynamic_pic.setVisibility(View.GONE); } holder.dynamic_title.setText(article.getTitle()); } } @Override public int getItemCount() { return getItems().size(); } public Object getItem(int position) { if (position < getItemCount()) { return getItems().get(position); } return null; } @Override public void onClick(View v) { if (null != mOnItemClickListener) { mOnItemClickListener.onClick(v, (Article) v.getTag()); } } public static class ViewHolder extends RecyclerView.ViewHolder { ImageView dynamic_image; TextView dynamic_title; ImageView dynamic_favorite; RelativeLayout dynamic_pic; public ViewHolder(View itemView) { super(itemView); dynamic_image = (ImageView) itemView.findViewById(R.id.dynamic_image); dynamic_title = (TextView) itemView.findViewById(R.id.dynamic_title); dynamic_favorite = (ImageView) itemView.findViewById(R.id.dynamic_favorite); dynamic_pic = (RelativeLayout) itemView.findViewById(R.id.dynamic_pic); } } private OnRecyclerViewItemClickListener mOnItemClickListener = null; public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; } public static interface OnRecyclerViewItemClickListener { void onClick(View view, Article doc); } }
注:recycleview的数据适配器,继承RecycleView.Adapter的子类,此处继承的是我在本类中定义的ViewHolder。强制重写的方法:
onCreateViewHolder(),onBindViewHolder(),和getItemCount();
在onCreateViewHolder(),方法中,需要返回,与当前adapter绑定的viewholder;
在onBindViewHolder()方法中,将数据填充到控件中;
getItemCont()的作用与listview的adapter方法中的getItemCount()一样。
6、RecycleView仿造listview的onItemClick方法
6.1在adapter中定义一个接口,和抽象方法;
public static interface OnRecyclerViewItemClickListener { void onClick(View view, Article doc); }
6.2在adapter中定义一接口对象,并添加set方法;
private OnRecyclerViewItemClickListener mOnItemClickListener = null; public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; }
6.3adapter类实现View的onClickListener接口,重写抽象方法;
public class Dynamic2Adapter extends RecyclerView.Adapter<Dynamic2Adapter.ViewHolder> implements View.OnClickListener { ... @Override public void onClick(View v) { if (null != mOnItemClickListener) { mOnItemClickListener.onClick(v, (Article) v.getTag()); } } ...
6.4在bindviewholder方法中,将数据传递给view
@Override public void onBindViewHolder(Dynamic2Adapter.ViewHolder holder, int position) { Article article = (Article) getItem(position); if (article != null) {
holder.itemView.setTag(article);//将数据传递 给view
String picUrl = article.getPicUrl(); if (picUrl != null) { UrlImageViewHelper.setUrlDrawable(holder.dynamic_image, picUrl); holder.dynamic_pic.setVisibility(View.VISIBLE); } else { holder.dynamic_pic.setVisibility(View.GONE); } holder.dynamic_title.setText(article.getTitle()); } }
6.5给recyclerview的gridview添加OnScrollListener方法;
gridView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); currentScrollState = newState; lastPositions = new int[staggeredGridLayoutManager.getSpanCount()]; staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions); lastVisibleItemPosition = findMax(lastPositions); int visibleItemCount = staggeredGridLayoutManager.getChildCount(); int totalItemCount = staggeredGridLayoutManager.getItemCount(); if (loading) { if (visibleItemCount > previousTotal) { loading = false; previousTotal = visibleItemCount; } } if ((visibleItemCount > 0 && currentScrollState == RecyclerView.SCROLL_STATE_IDLE && (lastVisibleItemPosition) >= totalItemCount - 1)) { new Thread() { public void run() { requestData(adapter); } }.start(); loading = true; } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); } });
6.6给recycleview添加onitemclick方法;
adapter.setOnItemClickListener(new Dynamic2Adapter.OnRecyclerViewItemClickListener() { @Override public void onClick(View view, Article doc) { Log.d("doc", String.valueOf(doc)); Intent intent = new Intent(Dynamic2Activity.this, ArticleDetailsActivity.class); intent.putExtra(ArticleDetailsActivity.EXTRA_DOC, doc); startActivity(intent); } });
7、RecycleView 的数据更新
listview中更新数据,通过的方法是notifyDataSetChanged()
RecycleView中,可以只更新一条数据
在adapter类中,定义如下方法;可以在其他地方调用
public void changeData(int position){ notifyItemChanged(position); } public void addData(int position){ notifyItemInserted(position); } public void removeData(int position){ notifyItemRemoved(position); }