学无止境,学以致用。
由于android 没有对RecyclerView 可添加Item的点击事件,那么我们可以自己去为每个Item添加点击事件;
思路: 为每个Item设置点击事件--->为每个Item设置点击事件--->item是在适配器里--->在适配器里的onCreateViewHolder方法内引用布局创建View
---->为view设置监听事件;
把这个创建Item监听事件的思路缕清了以后我们来看看MyAdapter的看看代码;
/**
* recyclerView的适配器,为每个item设置点击设置回调;要继承View.OnClickListener
*/
public class MyAdatper extends RecyclerView.Adapter<MyAdatper.MyViewHolder> implements View.OnClickListener {
private Context mContext;
private List<String> mList;
private OnItemClickListener mOnItemClickListener = null;
//用一个集合将适配中创建的所有 holder对象存储到这个容器中,因为本类中有对holder中的控件创建了监听事件
//如果不取消监听,可能会出现内存泄漏的问题,所以将holder保存,创建一个方法将绑定监听事件的控件的监听事件至空(个人观点)
private List<MyViewHolder> mListHolder ;
//添加一个销毁的方法,这样可以加快回收,可以解决内存泄漏的问题,
//可以用android studio 进行查看内存,多次开启和关闭程序,查看内存内存走势,
//如果不填加次方法,那么内存会一直增加,并且点GC 内存也不会下降。
//在activity的销毁方法中添加该方法,就解决了内存泄漏的方法。(这个方法不是最好的,但目前想到的解决方案只有这个,欢迎指点留言)
public void onDestroy(){
mList.clear;
mList = null;
for(i = 0 ;i < mListHolder.size ; i++){
mListHolder.get(i).itemView.setOnClickListener(null);
}
mListHolder.clear;
mListHolder = null;
}
public MyAdatper(Context mContext, List<String> mList) {
this.mContext = mContext;
this.mList = mList;
}
/**
* 创建一个监听事件的接口;重要
*/
public interface OnItemClickListener {
void onClick(View v ,int position);
}
/**
* 外界进行调用该方法,为item设置点击事件;重要
* @param listener
*/
public void setOnItemClickListener(OnItemClickListener listener){
this.mOnItemClickListener = listener;
}
@Override
public MyAdatper.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view =LayoutInflater.from(mContext).inflate(R.layout.recycler_item,parent,false);
//为每个item设置点击事件;
view.setOnClickListener(this);
return new MyViewHolder(view);
}
/**
* 这个是继承View.OnClickListener 实现的方法; 重要
* @param v 当前被点击的v;
*/
@Override
public void onClick(View v) {
//判断当前是否为item设置监听事件
if (mOnItemClickListener != null){
//如果设置了,那么回调该方法,由于view的tag是object类型的,希望能回调到当前所显示到第几项item所以进行类型转换,希望有更好的方法请赐教;
mOnItemClickListener.onClick(v,Integer.parseInt((String) v.getTag()));
}
}
@Override
public void onBindViewHolder(MyAdatper.MyViewHolder holder, int position) {
//一定要设置这个。要不在回调方法里面获得不到当前点击的是第几个item;注意tag是object类型的;重要;
holder.itemView.setTag(position+"");
}
@Override
public int getItemCount() {
return mList != null ? mList.size():0;
}
/**
*希望读者有良好的编码习惯,将ViewHolder类写成静态的.
**/
static class MyViewHolder extends RecyclerView.ViewHolder{
View itemView;
public MyViewHolder(View itemView) {
super(itemView);
//重要
this.itemView =itemView;
}
}
}
适配器写好了 那么我们看看该怎么直接调用
public class MyActvity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<String> mList;
private MyAdatper myAdatper;
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
myAdapter = new MyAdatper(this,mList);
mRecyclerView.setAdapter(myAdatper);
//这个就是创建一个监听事件;其他都没有什么差别;
myAdatper.setOnItemClickListener(new MyAdatper.OnItemClickListener() {
@Override
public void onClick(View v, int position) {
//返回的就是被点击的Item 和position
}
});
}
public void onDestroy(){
//在该生命周期的时候调用该方法,
myAdapter.onDestroy;
super.onDestroy();
}
}
上传一个已经设置好的类,只要继承该适配器 就可以使用了。记住 ---设置监听事件是调用adapter.setOnClickListener();adapter.setOnLongClickListener();