RecyclerView 的使用 (跨列的GridView)

RecyclerView 是5.0之后的新控件,类似于GridView 和 ListView,但是可塑性上要强过前者不少,网上已经有很多RecyclerView的例子了,今天自己写了几中样式的合集,希望能更好的帮助理解。

首先 ,RecyclerView 有一个 比较坑的地方,它本身不提供类似于ListView的OnItemClickListener() 方法 和 OnItemLongClickListener()方法,需要我们自己手动写一个。

写之前 先把RecyclerView引进来

compile 'com.android.support:recyclerview-v7:23.4.0'

首先先写两个接口

public interface OnItemClickListener {
    void onItemClick(View view, int position);
}
public interface OnItemLongClickListener {
    void onItemLongClick(View view, int position);
}

然后可以开始写RecyclerView 的 Adapter了

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
    private Context mContext;
    private List<String> list;

    private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;

    public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
        this.mOnItemClickListener = mOnItemClickListener;
    }
    public void setOnItemLongClickListener(OnItemLongClickListener mOnItemLongClickListener) {
        this.mOnItemLongClickListener = mOnItemLongClickListener;
    }


    public RecyclerViewAdapter(Context mContext, List<String> list) {

        this.mContext = mContext;
        this.list = list;
    }


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

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.iteam_recycle, parent, false);
        return new ViewHolder(view);

    }

    @Override
    public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder holder, int position) {
        TextView textView = (TextView) holder.mView.findViewById(R.id.text2);
        textView.setText(list.get(position).toString());

        if(mOnItemClickListener != null){
            //为ItemView设置监听器
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = holder.getLayoutPosition(); // 1
                    mOnItemClickListener.onItemClick(holder.itemView,position); // 2
                }
            });
        }
        if(mOnItemLongClickListener != null){
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int position = holder.getLayoutPosition();
                    mOnItemLongClickListener.onItemLongClick(holder.itemView,position);
                    //返回true 表示消耗了事件 事件不会继续传递
                    return true;
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return list.size();
    }


    public static class ViewHolder extends RecyclerView.ViewHolder {
        public final View mView;

        public ViewHolder(View view) {
            super(view);
            mView = view;
        }
    }
}

RecyclerView 的Adapter 代码和 ListView 的Adapter代码略有不同,不过也不难理解
首先需要继承RecyclerView.Adapter

public class RecycleActivity extends Activity {
    private RecyclerView mRecyclerView;
    private RecyclerViewAdapter recyclerViewAdapter;
    private List<String> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycle);
        recycleType = getIntent().getIntExtra("type",1);
        initDate();
        initView();


    }

    private void initDate() {
        for (int i = 0; i<20; i++){
            list.add(i,"第" + String.valueOf(i)+ "个");
        }
    }

    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.recycleView);
        recyclerViewAdapter = new RecyclerViewAdapter(this,list);

            //listview 样式
              //  mRecyclerView.setLayoutManager(new LinearLayoutManager(mRecyclerView.getContext()));


            //gridview 样式
              //  mRecyclerView.setLayoutManager(new GridLayoutManager(mRecyclerView.getContext(),2));



            //可以跨列的gridview 样式
                GridLayoutManager llmv;
                llmv = new GridLayoutManager(this,2, GridLayoutManager.VERTICAL, false);
                llmv.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                    @Override
                    public int getSpanSize(int position) {
                        //返回值:跨列数
                        if (position % 3 == 2){
                            return 2;
                        }
                        return 1;
                    }
                });
                mRecyclerView.setLayoutManager(llmv);





        //item Click点击事件
        recyclerViewAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Snackbar.make(view, "Snackbar comes out", Snackbar.LENGTH_LONG)
                        .setAction("点我就返回了", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                finish();
                            }
                        }).show();
            }
        });



        //item  长按事件 
        recyclerViewAdapter.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public void onItemLongClick(View view, int position) {
                Toast.makeText(RecycleActivity.this, ((TextView) view.findViewById(R.id.text2)).getText(),Toast.LENGTH_SHORT).show();
            }
        });



        mRecyclerView.setAdapter(recyclerViewAdapter);
    }
}

RecyclerView.LayoutManager,这是一个抽象类,好在系统提供了3个实现类:

1,LinearLayoutManager 现行管理器,支持横向、纵向。
2,GridLayoutManager 网格布局管理器
3,StaggeredGridLayoutManager 瀑布就式布局管理器

我在上面代码里实现了前两种,而且还做了一个可以跨列的GridView(说多了都是泪,坑比需求!!)
第三种瀑布流的样式在 鸿洋 大神的微博里已经有介绍了,这里就不写了~~

最后上一个跨列 gridview 的效果图(有点像砖墙~~)

这里写图片描述

好了~~
最后希望每天都能进步一点~~加油!

Demo地址:http://download.csdn.net/detail/lucifervsme/9648802

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值