RecyclerView更多的内容,请看RecyclerView-1RecyclerView-2

这里主要讲RecyclerView的监听器。

定义监听器接口

为了保证RecyclerViewAdapter的解耦性,此处将监听器接口定义在适配器的外部。

public interface onItemClickListener {
    void onNormalClickListener(View view, String string, int position);
    void onLongClickListener(View view, String string, int position);
}

接口中实现了普通点击长按两种点击事件,实现多少种类型看个人需求。

监听器实例化

adapter内部,维护一个onItemClickListener类型的全局变量mOnItemClickListener,并为其设置setter

private ListenerActivity.onItemClickListener mOnItemClickListener;
public void setOnItemClickListener(ListenerActivity.onItemClickListener onItemClickListener) {
    mOnItemClickListener = onItemClickListener;
}

同时,在外部重写监听器的内部方法,并把监听器通过setter设置给adapter

final ListenerAdapter adapter = new ListenerAdapter(data, this);
adapter.setOnItemClickListener(new onItemClickListener() {
    @Override
    public void onNormalClickListener(View view, String string, int position) {
        Log.d("ListenerActivity", "position = " + position + ", content = " + string);
    }

    @Override
    public void onLongClickListener(View view, String string, int position) {
        adapter.notifyItemRemoved(position);
        adapter.data.remove(position);
    }
});

mRecyclerView.setAdapter(adapter);

onNormalClickListener方法中log出被点击view的信息,而在onLongClickListener方法中删除被点击的item

监听器绑定

adapter需要实现View.onClickListenerView.onLongClickListener方法:

public class ListenerAdapter extends RecyclerView.Adapter<ListenerAdapter.TextViewHolder> implements View.OnClickListener, View.OnLongClickListener 

adapteronCreateViewHolder方法中,为view绑定监听器:

public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = mInflater.inflate(R.layout.text_item, parent, false);
    view.setOnClickListener(this);
    view.setOnLongClickListener(this);
    return new TextViewHolder(view);
}

数据与view绑定

在点击事件中,唯一传入的参数是view。如onclick(View v),如果想获取该view的更多信息,需要将对应的holder绑定到view上。

public void onBindViewHolder(TextViewHolder holder, int position) {
    holder.mTextView.setText(data.get(position));
    holder.itemView.setTag(holder);
}

点击事件中调用接口方法

adapter实现了View.onClickListenerView.onLongClickListener接口,需要重写接口的两个方法onClickonLongClick,在这两个方法中调用自定义接口onItemClickListener中对应的方法:

@Override
public void onClick(View v) {
    if (mOnItemClickListener != null) {
        TextViewHolder holder = (TextViewHolder) v.getTag();
        mOnItemClickListener.onNormalClickListener(v, holder.mTextView.getText().toString(), holder.getLayoutPosition());
    }
}

@Override
public boolean onLongClick(View v) {
    if (mOnItemClickListener != null) {
        TextViewHolder holder = (TextViewHolder) v.getTag();
        mOnItemClickListener.onLongClickListener(v, holder.mTextView.getText().toString(), holder.getLayoutPosition());
    }
    return true;
}

注意到,可以使用view.getTag()方法获得对应的holder,而通过holdergetLayoutPosition()等又可以获得更多信息。

同时,需要考虑onLongClick方法的返回值,返回为true说明点击事件被onLongClick消费掉,不会引起其他点击事件;若返回false,则onLongClick方法没有消费点击事件,在手指抬起时会触发onClick方法。

总结

虽然RecyclerView本事不提供onItemClickListener接口,但是通过自己实现能够实现更多自定义功能。

关于RecyclerView拖拽和滑动部分,请看RecyclerView-4