初识RecyclerView(三)

现在,我们用RecyclerView来实现瀑布流的效果,我们来看一下效果图:

这里写图片描述

根据之前对RecyclerView的了解,我们要实现这个效果,我的大体思路是:在onCreate()方法里,通过设置LayoutManager来设置瀑布流的布局和增加、删除的样式;在adapter里可以设置数据的不同高度;RecyclerView没有监听事件,我们需要自己来定义接口,实现它的点击事件。下面,我们一步步来实现。

一、我们来实现瀑布流的样式,在onCreate()方法里来设置

//设置recycleView的straggerdV的布局管理样式
        StaggeredGridLayoutManager staggeredGrid = new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGrid);
        //设置recycleView的增加样式
        recyclerView.setItemAnimator(new DefaultItemAnimator());

二、实现增加、删除的效果

//点击删除按钮,固定的删除位置为1的item
 public void deleteItem(View view) {
        mData.remove(1);
        //这里需要注意一下,我们调用的是notifyItemRemoved()方法
        straggerAdater.notifyItemRemoved(1);
    }
//点击增加按钮
    public void addItem(View view) {
        mData.add(1, "insert one");
        straggerAdater.notifyItemInserted(1);

    }

三、在adapter里,设置不同的数据高度

private List<Integer> mHeights;

public StraggerAdater(List<String> mData, Context mcontext) {
        this.mData = mData;
        this.mcontext = mcontext;
        mInflater = LayoutInflater.from(mcontext);

        mHeights = new ArrayList<>();
        for (int i = 0; i < mData.size(); i++) {
            mHeights.add((int) (100 + Math.random() * 300));
        }
    }

@Override
    public void onBindViewHolder(final MyViewHolder myViewHolder, final int i) {
        //给每一项设置高度
        ViewGroup.LayoutParams lp = myViewHolder.itemView.getLayoutParams();
        lp.height = mHeights.get(i);
        myViewHolder.itemView.setLayoutParams(lp);

        myViewHolder.textView.setText(mData.get(i));
  }

写完上面这些代码,我们可以实现瀑布流的布局和增加、删除的动画效果了。

四、我们来实现Item的监听事件

    //首先,完善我们的adapter
    //我们定义一个接口,接口里有长点击和短点击的不同方法
    public interface onItemClickListener {
        public void setOnItemClick(View view, int pos);

        public void setOnLongItemClick(View view, int pos);
    }
   //声明一个监听者、提供一个监听方法 
 private onItemClickListener listener;

 public void setOnItemClickListener(onItemClickListener listener) {
        this.listener = listener;
    }

//在onBindViewHolder()方法里实现接口方法
@Override
    public void onBindViewHolder(final MyViewHolder myViewHolder, final int i) {
        //给每一项设置高度
        ViewGroup.LayoutParams lp = myViewHolder.itemView.getLayoutParams();
        lp.height = mHeights.get(i);
        myViewHolder.itemView.setLayoutParams(lp);

        myViewHolder.textView.setText(mData.get(i));

        if (listener != null) {
            //短点击
            myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //从holder里取出position
                    int layoutPos = myViewHolder.getPosition();
                    listener.setOnItemClick(myViewHolder.itemView, layoutPos);
                }
            });
            //长点击
            myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int layoutPos = myViewHolder.getPosition();
                    listener.setOnLongItemClick(myViewHolder.itemView, layoutPos);
                    return false;
                }
            });
        }
    }

在主activity里adapter实现监听

 straggerAdater.setOnItemClickListener(new StraggerAdater.onItemClickListener() {
            @Override
            public void setOnItemClick(View view, int pos) {
                Toast.makeText(StraggerViewActivity.this, "click : " + pos, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void setOnLongItemClick(View view, int pos) {
                Toast.makeText(StraggerViewActivity.this, "longClick : " + pos, Toast.LENGTH_SHORT).show();
            }
        });

这样,我们就自己实现了点击事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值