RecyclerView-3 (监听器)
- coding
- android
- recyclerview
对RecyclerView更多的内容,请看RecyclerView-1和RecyclerView-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.onClickListener和View.onLongClickListener方法:
public class ListenerAdapter extends RecyclerView.Adapter<ListenerAdapter.TextViewHolder> implements View.OnClickListener, View.OnLongClickListener
在adapter的onCreateViewHolder方法中,为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.onClickListener和View.onLongClickListener接口,需要重写接口的两个方法onClick和onLongClick,在这两个方法中调用自定义接口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,而通过holder的getLayoutPosition()等又可以获得更多信息。
同时,需要考虑onLongClick方法的返回值,返回为true说明点击事件被onLongClick消费掉,不会引起其他点击事件;若返回false,则onLongClick方法没有消费点击事件,在手指抬起时会触发onClick方法。
总结
虽然RecyclerView本事不提供onItemClickListener接口,但是通过自己实现能够实现更多自定义功能。
关于RecyclerView拖拽和滑动部分,请看RecyclerView-4。