RecyclerView 使用总结(三):点击事件、GridView等、瀑布流、动态增删

一、RecyclerView的点击事件

实现方法:在适配器Adapter中定义接口,接口中定义两个方法:一个点击事件、一个长按事件。然后在onBindViewHolder中调用,利用view.setOnClickListener()和view.setOnLongClickListener()方法实现。最后在Activity中给适配器设置监听接口的对象就ok了。代码如下,适配器:
监听接口

 public interface OnRecyclerViewItemListener {
        public void onItemClickListener(View view,int position);
        public void onItemLongClickListener(View view, int position);
    }

    private OnRecyclerViewItemListener mOnRecyclerViewItemListener;

    public void setOnRecyclerViewItemListener(OnRecyclerViewItemListener listener){
        mOnRecyclerViewItemListener = listener;
    }

点击事件:

private void itemOnClick(final RecyclerView.ViewHolder holder){
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
          int pos = holder.getLayoutPosition();      mOnRecyclerViewItemListener.onItemClickListener(holder.itemView, pos);
            }
        });
    }

长按事件:


    private void itemOnLongClick(final RecyclerView.ViewHolder holder){
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                 int pos = holder.getLayoutPosition(); mOnRecyclerViewItemListener.onItemLongClickListener(holder.itemView, pos);

                //返回true是为了防止触发onClick事件
                return true;
            }
        });
    }

在onBindViewHolder中调用:

public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
          holder).textView.setText(mDatas.get(position));
            //getLayoutPosition()方法会准确的获取到item的位置id

            onItemSonViewClick(holder);
            if (mOnRecyclerViewItemListener != null){
                itemOnClick(holder);
                itemOnLongClick(holder);
            }
    }

activity中的代码:

    private void onRecyclerItemClickListener(){
        mAdapter.setOnRecyclerViewItemListener(new RecyclerViewAdapter.OnRecyclerViewItemListener() {
            @Override
            public void onItemClickListener(View view, int position) {
                Toast.makeText(MainActivity.this,"onClick:"+position,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClickListener(View view, int position) {
                Toast.makeText(MainActivity.this,"onLongClick:"+position,Toast.LENGTH_SHORT).show();
            }
        });
    }

到此,RecyclerView的点击事件实现了。

二、用RecyclerView实现GridView、横向GridView、横向ListView

注意:此时不要添加分割线了,即去掉recyclerView.addItemDecoration()方法,在子View的布局中的最外层的Layout中添加android:layout_margin=”3dp”来实现分割线。
实现这三个的思路是一样的,都是更改LayoutManger就可以完成了,一句代码的事。
①、GridView:

mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));

②、横向GridView:

                mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.HORIZONTAL));

③、横向ListView:

                mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));

三、瀑布流的实现

思路:相当在GridView中把Item的高度设置成不同的,即在适配器Adapter中添加一个高度的集合,在onBindViewHolder中设置itemView的高度即可。

适配器:

public class WaterFallAdapter extends RecyclerView.Adapter<WaterFallAdapter.WaterFallItemHolder> {
    private Context mContext;
    private LayoutInflater mInflater;
    public List<String> mDatas;
    private List<Integer> heights;

    public WaterFallAdapter(Context context, List<String> datas) {
        this.mContext = context;
        this.mDatas = datas;
        mInflater = LayoutInflater.from(mContext);
        heights = new ArrayList<>();
        for (int i = 0;i<mDatas.size();i++){
            heights.add((int)(100+Math.random()*300));
        }
    }

    @Override
    public void onBindViewHolder(WaterFallAdapter.WaterFallItemHolder holder, final int position) {
        holder.textView.setText(mDatas.get(position));
        ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
        lp.height = heights.get(position);
        holder.itemView.setLayoutParams(lp);
    }

    @Override
    public WaterFallAdapter.WaterFallItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.waterfall_item, parent, false);
        WaterFallItemHolder mItemViewHolder = new WaterFallItemHolder(view);
        return mItemViewHolder;
    }

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

    class WaterFallItemHolder extends RecyclerView.ViewHolder {
        protected TextView textView;
        public WaterFallItemHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.text_view);
        }
    }
}

WaterfallActivity.java:

public class WaterFallActivity extends Activity {

    private RecyclerView recyclerView;
    private List<String> datas;
    private WaterFallAdapter waterFallAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.water_fall);
        initDatas();
        initView();
    }

    private void initDatas(){
        datas = new ArrayList<>();
        for (int i = 'A';i<'z';i++){
            datas.add(""+(char)i);
        }
    }

    private void initView(){
        recyclerView = (RecyclerView) findViewById(R.id.waterfall_recycler_view);
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
        waterFallAdapter = new WaterFallAdapter(this,datas);
        recyclerView.setAdapter(waterFallAdapter);
    }
}

至此,瀑布流实现了。

四、RecyclerView中item的增加、移除动画

①、设置动画属性:recyclerView.setItemAnimator(new DefaultItemAnimator());
DefaultItemAnimator是自带的一个动画效果,在github上有其他的动画效果:https://github.com/gabrielemariotti/RecyclerViewItemAnimators
使用方法看一下github就知道了。
②、在适配器Adapter中定义 增加、移除两个方法:

 public void insertData(String data,int position){
        mDatas.add(position,data);
        //注意这里一定是用notifyItemInserted()方法来更新,如果用notifyDataSetChanged()的话,就没有动画效果了。
        notifyItemInserted(position);
    }
 public void removeData(int position){
        mDatas.remove(position);
        //注意这里一定是用notifyItemRemoved()方法来更新,如果用notifyDataSetChanged()的话,就没有动画效果了。
        notifyItemRemoved(position);
    }

注意:此时处理点击事件时,一定要用holder.getLayoutPosition()来获取位置id,且要放在点击事件接口的方法中。

然后在Activity中调用这两个方法就ok了。

代码下载请点我

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值