Android RecyclerView

本文详细介绍了RecyclerView组件,包括其相较于ListView的优势、基本使用方法及常见问题解决。通过实例展示了如何添加依赖、配置适配器以及处理点击事件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/detail/androidxiaogang/9513725

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值