码迷,mamicode.com
首页 > 移动开发 > 详细

Android RecyclerView

时间:2016-05-13 00:17:38      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

1、RecyclerView

RecyclerView是android 5.0 materials design中的一个组件,从名称上可以看出,它的作用 主要作用是复用问题。平常我们在listview中 也可以轻松的实现listview的复用问题。但是从目前的需求上来讲,listview的功能比较单一,实现一些比较特殊的效果或者加入动画都比较难,因此google推出这recyclerview不仅实现listview中复用问题,而且实现瀑布流,横着的条目,加入动画都比较容易实现。

2、RecyclerView的使用

1、添加依赖
首先我们要gradle的依赖库中添加 compile ‘com.android.support:recyclerview-v7:21.+’
技术分享 技术分享

2、在适配中代码

public class MyRecyclerViewAdapter extends RecyclerView.Adapter implements View.OnClickListener {


    private Context context;

    private ArrayList list;


    private OnRecyclerViewItemClickListener mOnItemClickListener = null;



    public  interface OnRecyclerViewItemClickListener {
        void onItemClick(View view , String data);
    }
    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }
    public MyRecyclerViewAdapter(Context context, ArrayList list) {
        this.context=context;
        this.list=list;
    }

    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            //注意这里使用getTag方法获取数据
            mOnItemClickListener.onItemClick(v, (String) v.getTag());
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item,null);
        ViewHodler vh=new ViewHodler(view);
        LinearLayout.LayoutParams lp = new LinearLayout.
                LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        view.setLayoutParams(lp);
        view.setOnClickListener(this);
        return vh;
    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        ViewHodler mHodler = (ViewHodler) holder;

        mHodler.textview.setText(list.get(position) + "");
        mHodler.itemView.setTag(list.get(position));
    }

    @Override
    public int getItemCount() {
        Log.i("size",list.size()+"");
        return list.size();
    }

    class ViewHodler extends RecyclerView.ViewHolder{

        private TextView textview;
        public ViewHodler(View itemView) {
            super(itemView);

            textview= (TextView) itemView.findViewById(R.id.textview);



//            itemView.setOnClickListener(new View.OnClickListener() {
//                @Override
//                public void onClick(View v) {
//                    Toast.makeText(context,"click"+getPosition(),Toast.LENGTH_SHORT).show();
//                }
//            });
        }
    }
}

3、在activity中的配置

public class MainActivity extends Activity implements MyRecyclerViewAdapter.OnRecyclerViewItemClickListener {
    private ArrayList list;
    private RecyclerView mRecyclerView;
    private LinearLayoutManager linearLayoutManager;
    private MyRecyclerViewAdapter adapter;
    private String tag;
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
        mRecyclerView= (RecyclerView) findViewById(R.id.recyerview);
        list=new ArrayList();
        linearLayoutManager=new LinearLayoutManager(this);
        initData();
        tag=getIntent().getStringExtra("list");
        if(tag.equals("0")){
            //设置普通列表
           toolbar.setTitle("RecyclerViewList");
            linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            mRecyclerView.setLayoutManager(linearLayoutManager);
            adapter=new MyRecyclerViewAdapter(this,list);
            mRecyclerView.setAdapter(adapter);
            adapter.setOnItemClickListener(this);
        }else if(tag.equals("1")){
            //设置横向列表
            toolbar.setTitle("RecyclerViewList");
            linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
            mRecyclerView.setLayoutManager(linearLayoutManager);
            adapter=new MyRecyclerViewAdapter(this,list);
            mRecyclerView.setAdapter(adapter);
        }else if(tag.equals("2")){
            //设置表格列表
            toolbar.setTitle("RecyclerViewDemoGrid");
            mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));
            adapter=new MyRecyclerViewAdapter(this,list);
            mRecyclerView.setAdapter(adapter);
        }

    }

    private void initData() {
        for(int i=0;i<=30;i++){
            list.add("this is item "+i);
        }
    }

    @Override
    public void onItemClick(View view, String data) {
        Toast.makeText(MainActivity.this, "click item "+data, Toast.LENGTH_SHORT).show();
    }

3、RecyclerView中遇到的问题

1、RecyclerView中item的点击事件

RecyclerView没有直接提供item的点击事件,像Listview的点击事件,我们可以直接设置item的点击事件。但recyclerview需要我们自已设置点击事件。
recyclerview的设计是比较炫酷的效果,轻松实现item的左右滑动,或者拖动之类。而且又在这基础上增加了许多动画效果。因此Recyclerview基本上是负责控件层的,把大部分将要实现的功能交给使用者自已去实现。
第一种方式,直接在ViewHolder中设置点击事件

 class ViewHodler extends RecyclerView.ViewHolder{

        private TextView textview;
        public ViewHodler(View itemView) {
            super(itemView);

            textview= (TextView) itemView.findViewById(R.id.textview);



//            itemView.setOnClickListener(new View.OnClickListener() {
//                @Override
//                public void onClick(View v) {
//                    Toast.makeText(context,"click"+getPosition(),Toast.LENGTH_SHORT).show();
//                }
//            });
        }
    }

第二种方式是设置监听事件,当点击的时候回调
第一步:定义接口,并声明

 public  interface OnRecyclerViewItemClickListener {
        void onItemClick(View view , String data);
    }
    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }

声明:

private OnRecyclerViewItemClickListener mOnItemClickListener = null;

第二步
在onBindViewHolder中设置Tag

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        ViewHodler mHodler = (ViewHodler) holder;

        mHodler.textview.setText(list.get(position) + "");
        mHodler.itemView.setTag(list.get(position));
    }

第三步,在点击事件的时候回调

@Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            //注意这里使用getTag方法获取数据
            mOnItemClickListener.onItemClick(v, (String) v.getTag());
        }
    }

as demo下载地址http://download.csdn.net/detail/androidxiaogang/9513725

Android RecyclerView

标签:

原文地址:http://blog.csdn.net/androidxiaogang/article/details/51344432

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!