RecyclerView的适配器

学无止境,学以致用。

由于android 没有对RecyclerView 可添加Item的点击事件,那么我们可以自己去为每个Item添加点击事件;


思路: 为每个Item设置点击事件--->为每个Item设置点击事件--->item是在适配器里--->在适配器里的onCreateViewHolder方法内引用布局创建View

---->为view设置监听事件;


把这个创建Item监听事件的思路缕清了以后我们来看看MyAdapter的看看代码;

/**
 * recyclerView的适配器,为每个item设置点击设置回调;要继承View.OnClickListener
 */
public class MyAdatper extends RecyclerView.Adapter implements View.OnClickListener {
    private Context mContext;
    private List mList;
    private OnItemClickListener mOnItemClickListener = null;
	
	//用一个集合将适配中创建的所有 holder对象存储到这个容器中,因为本类中有对holder中的控件创建了监听事件
	//如果不取消监听,可能会出现内存泄漏的问题,所以将holder保存,创建一个方法将绑定监听事件的控件的监听事件至空(个人观点)
	private List 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 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 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();


本文章仅供参考;



你可能感兴趣的:(RecyclerView的适配器)