RecyclerView的监听事件

一、 为RecyclerView的item添加监听事件

在对RecyclerView的item进行操作的时候会遇到点击事件和长按事件,但是在RecyclerView中没有直接的方法进行监听,需要我们在适配器里面对item进行监听,或者提供一个接口给RecyclerView调用,实现点击和长按的事件监听事件。在适配器里面对item进行监听实际上是对填充到列表项的view进行监听,实现的是setOnClickListener和setOnLongClickListener方法。

@NonNull
    @Override
    public CreateHolder onCreateViewHolder(@NonNull ViewGroup parent, final int viewType) {
        View view = LayoutInflater.from (parent.getContext ()).inflate (R.layout.create_list_item_layout,parent,false);
        final CreateHolder holder = new CreateHolder (view);
        view.setOnLongClickListener (new View.OnLongClickListener () {
            @Override
            public boolean onLongClick(View view) {
                return false;
            }
        });
        view.setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick(View view) {
            }
        });
        return holder;
    }

二、 为RecyclerView添加滑动事件监听

RecyclerView在滑动的时候可以直接对滑动事件进行监听,可以直接在RecyclerView的对象调用addOnScrollListener接口,然后可以复写两个方法,onScrollStateChanged用来监听滑动状态的改变,
onScrolled用来监听滑动的动作。

mRecyclerView.addOnScrollListener (new RecyclerView.OnScrollListener () {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged (recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled (recyclerView, dx, dy);
            }
        });

三、 RecyclerView的预加载功能

RecyclerView在进行加载的时候由传入的数据决定加载的数量,如果传入的数量太多,在加载的时候会浪费许多内存,也会消耗大量的资源,加载也比较耗时。在对RecyclerView进行滑动监听的时候可以选择对item进行预加载,只显示每一次加载的item,在滑动到底部的时候进行下一次加载,添加到list里面,进行显示,这样就能实现一个预加载的功能。

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private RecyclerAdapter adapter;
    private Boolean isLoadItem = false;
    private LinearLayoutManager manager;
    List<Item> list = ItemFactory.createItem(20);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initRecyclerView ();
    }

    public void initRecyclerView(){
        mRecyclerView = findViewById(R.id.recycler_view);
        adapter = new RecyclerAdapter(this,list);
        //设置LayoutManager
        manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        mRecyclerView.setLayoutManager(manager);
        //设置动画效果
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        //设置适配器
        mRecyclerView.setAdapter(adapter);
        //添加默认的分割线
        mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
        mRecyclerView.addOnScrollListener (new RecyclerView.OnScrollListener () {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged (recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled (recyclerView, dx, dy);
                Log.d ("scroll",dx+" "+dy);
                int lastItem = manager.findLastVisibleItemPosition ()+1;
                int totalItem = manager.getItemCount ();
                Toast.makeText (MainActivity.this,"last item is"+lastItem+"/"+totalItem,Toast.LENGTH_SHORT).show ();
                if(lastItem+1 == totalItem){
                    if(isLoadItem){
                        Toast.makeText (MainActivity.this,"已经加载",Toast.LENGTH_SHORT).show ();
                    }else {
                        loadMore (20);

                    }
                    isLoadItem = !isLoadItem;
                }
            }
        });
    }

    public void loadMore(int num){
        for(int i=0;i<num;i++){
            list.add (ItemFactory.createItem (20).get (i));
            //更新列表
            adapter.notifyDataSetChanged ();
        }
    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,916评论 25 708
  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 从Android 5.0...
    Rtia阅读 307,740评论 27 439
  • 本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近打算花点精力来研究 RecyclerVie...
    请叫我大苏阅读 47,033评论 14 237
  • 痹者,风寒暑湿之气,中于人脏腑之为也。入腑则病浅易洽,入脏则病深难治。而有风痹,有寒痹,有湿痹,有热痹,有气痹,而...
    天一书社阅读 795评论 0 0
  • 当我想写你的时候,我原本是想洋洋洒洒的写下好多好多字,可是当我开始的时候,我却发觉自己无从下手,就从我见到你的那个...
    亲爱的陈先生阅读 139评论 0 0