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。