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