RecyclerView使用指南(三)—— 添加分割线和点击事件

声明:原创作品,转载请注明出处:https://www.jianshu.com/p/4d658b0b7d40

今天来说一说,我们如何给自己的RecyclerView添加分割线和点击事件,讲完这两个功能点,已经可以满足日常开发工作了。

一、分割线:

这个功能非常简单,因为SDK已经为我们实现了这个功能,我们只需要调用RecyclerView的addItemDecoration()方法,并传入DividerItemDecoration的对象就OK了。代码如下:

    RecyclerView recyclerView = findViewById(R.id.rv);
    RvAdapter adapter = new RvAdapter(list);
    recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
    recyclerView.setAdapter(adapter);

这样,我们就为我们的RecyclerView添加了分割线。

二、点击事件

RecyclerView本身没有提供点击事件给我们,所以我们需要自己实现这个功能。

  • 基本思路:
  1. 创建OnItemClickListener接口。
  2. 修改Adapter,增加OnItemClickListener类型的成员变量和set方法。
  3. 在onBindViewHolder()方法中,根据OnItemClickListener,为条目设置监听。
  4. 在Activity中设置点击监听。

好,有了思路,我们开始一步一步的执行:
创建接口OnItemClickListener:

package com.liuym.myapplication;

import android.view.View;

public interface OnItemClickListener {
    void onItemClick(View view, int positon);
}

修改Adapter:

package com.liuym.myapplication;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

public class RvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    //条目类型
    public static final int TYPE_0 = 0;
    public static final int TYPE_1 = 1;

    //数据源
    private List<Data> mList;
    //点击监听
    private OnItemClickListener mOnItemClickListener;

    public RvAdapter(List<Data> list) {
        mList = list;
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View item;
        RecyclerView.ViewHolder holder = null;
        if (viewType == TYPE_0) {
            item = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_rv_type1, viewGroup, false);
            holder = new Type0ViewHolder(item);
        }
        if (viewType == TYPE_1) {
            item = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_rv_type2, viewGroup, false);
            holder = new Type1ViewHolder(item);
        }
        return holder;
    }

    /**
     * 根据数据源的某一项,返回相应的布局类别
     *
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        return mList.get(position).getType();
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
        int type = getItemViewType(i);
        Data data = mList.get(i);
        if (type == TYPE_0) {
            Type0ViewHolder holder = (Type0ViewHolder) viewHolder;
            holder.iv.setImageResource(R.drawable.ic_launcher_background);
            holder.tv.setText(data.getText());
            if (mOnItemClickListener != null) {
                holder.ll.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mOnItemClickListener.onItemClick(v,i);
                    }
                });
            }
        }
        if (type == TYPE_1) {
            Type1ViewHolder holder = (Type1ViewHolder) viewHolder;
            holder.iv.setImageResource(R.drawable.ic_launcher_background);
            holder.tv.setText(data.getText());
            if (mOnItemClickListener != null) {
                holder.ll.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mOnItemClickListener.onItemClick(v,i);
                    }
                });
            }
        }
    }

    @Override
    public int getItemCount() {
        return mList == null ? 0 : mList.size();
    }


    class Type0ViewHolder extends RecyclerView.ViewHolder {
        LinearLayout ll;
        ImageView iv;
        TextView tv;

        public Type0ViewHolder(@NonNull View itemView) {
            super(itemView);
            ll = itemView.findViewById(R.id.ll);
            iv = itemView.findViewById(R.id.iv);
            tv = itemView.findViewById(R.id.tv);
        }
    }

    class Type1ViewHolder extends RecyclerView.ViewHolder {
        LinearLayout ll;
        ImageView iv;
        TextView tv;

        public Type1ViewHolder(@NonNull View itemView) {
            super(itemView);
            ll = itemView.findViewById(R.id.ll);
            iv = itemView.findViewById(R.id.iv);
            tv = itemView.findViewById(R.id.tv);
        }
    }
}

在Activity中为Adapter设置条目点击事件:

    adapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(View view, int positon) {
            Toast.makeText(MainActivity.this, list.get(positon).getText(), Toast.LENGTH_SHORT).show();
        }
    });

总结

这一篇,我讲解了如何添加分割线和Item的点击事件,下一篇我会详细的讲解一下ItemDecoration的使用方式。

系列文章

《RecyclerView使用指南(一)—— 基本使用》
《RecyclerView使用指南(二)—— 多种ItemLayout》
《RecyclerView使用指南(三)—— 添加分割线和点击事件》
《RecyclerView使用指南(四)—— 使用ItemDecoration》
《RecyclerView使用指南(五)—— 实现吸顶效果》

推荐阅读更多精彩内容