RecyclerView实现瀑布流,长按删除条目效果

最近在逛CSDN的时候发现一篇RecyclerView实现瀑布流效果的文章,看完之后便自己动手做了一下,比较简单,实现的效果也挺好的,在这里分享给大家以供参考!

1.添加RecyclerView的依赖:

implementation 'com.android.support:recyclerview-v7:26.1.0'

2.设置初始化数据,这里模拟一下列表数据:

 protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_waterfall);
        initData();
        initView();


    }

    private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < 200; i++){
            list.add("第" + i + "条数据");
        }
    }

3.初始化视图,给RecyclerView设置布局参数和Adapter:

private void initView() {
        mRecyclerview = findViewById(R.id.recyclerview);//找控件
        adapter = new RecycleAdapter(list);//适配器
        mRecyclerview.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//布局管理器

        mRecyclerview.setAdapter(adapter);//设置适配器
        mRecyclerview.setItemAnimator(new DefaultItemAnimator());//设置条目默认动画
        onClick();
    }

在这里可以给删除条目的设置一个动画,有兴趣的童鞋可以自己去加想要的动画,我这里简单起见设置了默认的动画,在设置布局管理器的时候,里面的参数分别代表着几列和方向:

mRecyclerview.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//布局管理器

4.onClick()是RecyclerView条目的的点击事件,这里我采用的是接口回调:

private void onClick() {
        adapter.setOnItemClickListener(new RecycleAdapter.onItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(WaterFallDemo.this,"点击了第"+position+"条数据",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongItemClick(View view, int position) {
                adapter.removeItem(position);
            }
        });
    }

5.接下来就是适配器部分的内容了

首先新建并初始化一个用以装载item随机高度的集合,在后面动态改变高度:

 private List<String> mlist;
    private List<Integer> mheight;
//    private Context context;

    public RecycleAdapter(List<String> list){
        this.mlist = list;
//        this.context = context;
        mheight = new ArrayList<Integer>();
        for (int i = 0 ;i<list.size();i++){
            mheight.add((int)(150+Math.random()*300));
        }
        Log.e("hhhhhh",mlist.size()+"");
    }

然后动态设置每个条目的高度:

 ViewGroup.LayoutParams params = ((ViewHolder)holder).textView.getLayoutParams();
        params.height = mheight.get(position);
        ((ViewHolder)holder).textView.setLayoutParams(params);
        ((ViewHolder)holder).textView.setText(mlist.get(position));

接着是接口回调条目点击事件:

 //接口回调条目的点击事件
        if (mlistener != null){
            ((ViewHolder)holder).itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getAdapterPosition();
                    mlistener.onItemClick(holder.itemView,pos);
                }
            });
            ((ViewHolder)holder).itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int pos = holder.getAdapterPosition();
                    mlistener.onLongItemClick(holder.itemView,pos);
                    return false;
                }
            });
        }

最后是接口回调的设置:

  //设置接口回调
    private onItemClickListener mlistener;
    public interface onItemClickListener {
        void onItemClick(View view,int position);
        void onLongItemClick(View view,int position);
    }
    public void setOnItemClickListener(onItemClickListener listener){
        this.mlistener = listener;
    }

    //长按条目删除
    public void removeItem(int position){
        mlist.remove(position);
        notifyItemRemoved(position);
    }

6.ok,到此就可以实现瀑布流加长按删除的的效果了。下面附上我的完整代码和2个布局文件activity_waterfall和waterfall_item:

activity_waterfall:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">


    </android.support.v7.widget.RecyclerView>

</LinearLayout>

waterfall_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
    android:id="@+id/textview"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:gravity="center"
    android:background="#28c8b7"
    android:layout_marginTop="5dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:text="1"
    />


</LinearLayout>

WaterFallDemo.java:

package com.example.os.nestedscrollingdemo.view;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Toast;

import com.example.os.nestedscrollingdemo.R;
import com.example.os.nestedscrollingdemo.RecycleAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by OS on 2018/3/20.
 */

public class WaterFallDemo extends AppCompatActivity {

    private List<String> list;

    private RecyclerView mRecyclerview;
    private RecycleAdapter adapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_waterfall);
        initData();
        initView();


    }

    private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < 200; i++){
            list.add("第" + i + "条数据");
        }
    }

    private void initView() {
        mRecyclerview = findViewById(R.id.recyclerview);//找控件
        adapter = new RecycleAdapter(list);//适配器
        mRecyclerview.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//布局管理器

        mRecyclerview.setAdapter(adapter);//设置适配器
        mRecyclerview.setItemAnimator(new DefaultItemAnimator());//设置条目默认动画
        onClick();
    }

    private void onClick() {
        adapter.setOnItemClickListener(new RecycleAdapter.onItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(WaterFallDemo.this,"点击了第"+position+"条数据",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongItemClick(View view, int position) {
                adapter.removeItem(position);
            }
        });
    }
}

RecycleAdapter.java:

package com.example.os.nestedscrollingdemo;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by OS on 2018/3/12.
 */

public class RecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<String> mlist;
    private List<Integer> mheight;
//    private Context context;

    public RecycleAdapter(List<String> list){
        this.mlist = list;
//        this.context = context;
        mheight = new ArrayList<Integer>();
        for (int i = 0 ;i<list.size();i++){
            mheight.add((int)(150+Math.random()*300));
        }
        Log.e("hhhhhh",mlist.size()+"");
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.waterfall_item,parent,false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
        ViewGroup.LayoutParams params = ((ViewHolder)holder).textView.getLayoutParams();
        params.height = mheight.get(position);
        ((ViewHolder)holder).textView.setLayoutParams(params);
        ((ViewHolder)holder).textView.setText(mlist.get(position));
        //接口回调条目的点击事件
        if (mlistener != null){
            ((ViewHolder)holder).itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getAdapterPosition();
                    mlistener.onItemClick(holder.itemView,pos);
                }
            });
            ((ViewHolder)holder).itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int pos = holder.getAdapterPosition();
                    mlistener.onLongItemClick(holder.itemView,pos);
                    return false;
                }
            });
        }

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        private  TextView textView;

        public ViewHolder(View itemView) {
            super(itemView);
             textView = itemView.findViewById(R.id.textview);
        }
    }


    //设置接口回调
    private onItemClickListener mlistener;
    public interface onItemClickListener {
        void onItemClick(View view,int position);
        void onLongItemClick(View view,int position);
    }
    public void setOnItemClickListener(onItemClickListener listener){
        this.mlistener = listener;
    }

    //长按条目删除
    public void removeItem(int position){
        mlist.remove(position);
        notifyItemRemoved(position);
    }

}

欢迎各位提出宝贵建议,一起交流学习!

转载自:http://blog.csdn.net/nazicsdn/article/details/79607148



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值