天天看點

RecyclerView監聽

學習導航

第一節:http://blog.csdn.net/bobo8945510/article/details/52823539 認識RecyclerView

第二節:http://blog.csdn.net/bobo8945510/article/details/52849084 RecyclerView分割線設定

第三節:http://blog.csdn.net/bobo8945510/article/details/52851558 RecyclerView布局靠左問題

四三節:http://blog.csdn.net/bobo8945510/article/details/52858500 RecyclerView實作監聽

第五節:http://blog.csdn.net/bobo8945510/article/details/52860777 RecyclerView三種不同布局風格

第六節:http://blog.csdn.net/bobo8945510/article/details/52881647 RecyclerView增加和删除效果

RecyclerView監聽的實作

RecyclerView監聽
RecyclerView的監聽和listview有很大的差別,listview本身就擁有setOnItemClickListener()方法,RecyclerView不再負責Item視圖的布局及顯示,是以RecyclerView也沒有為Item開放OnItemClick等點選事件。是以我們需要子自己去定義此方法。

和ListView不一樣的是,RecyclerView不再負責Item的擺放等顯示方面的功能。所有和布局、繪制等方面的工作Google都其拆分成不同的類進行管理。是以開發者可以自定義各種各樣滿足定制需求的的功能類。下面是一些和RecyclerView相關的非常重要的類清單。

RecyclerView監聽

RecyclerView監聽的實作流程,要和listview差別開

一、我們自己在“擴充卡代碼類中”先去定義一個監聽接口,一個監聽的方法。如圖:

RecyclerView監聽

二、由于我添加監聽,是以我們需要ViewHoder去設定控件。如圖:

RecyclerView監聽

三、我們在“onBindViewHolder()”方法中去添加監聽。也可以如下圖寫,在其他類中調用,也可以在此直接Toast:

RecyclerView監聽

四、我們在“MainActivity”類中引用我們的定義好的監聽方法

RecyclerView監聽

五、注意,我們使用的adapter去引用的,而不是RecycleView的對象引用的。要看仔細!

  • 适配類中的代碼
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by ENZ on 2016/10/15.
 */
class ViewHoderAdaapters extends RecyclerView.Adapter {

    private Context context;
    private String[] datas;
    private LayoutInflater inflater;
    private OnItemClickListener mOnItemClickListener;


    //添加一個OnItemClickListener接口,并且定義兩個方法
    public interface OnItemClickListener{
        void onClick(int position);
        void onLongClick(int position);
    }

    //然後定義一個監聽的方法,便于主類調用
    public void setOnItemListener(OnItemClickListener onItemListener){
        this.mOnItemClickListener = onItemListener;
    }

    //構造方法
    public ViewHoderAdaapters(MainActivity mainActivity, String[] data) {
        this.context = mainActivity;
        this.datas = data;
        inflater = LayoutInflater.from(context);
    }
    @Override
    //重寫onCreateViewHolder方法,傳回一個自定義的ViewHolder
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.main_item,parent,false);
        ViewHoders viewHoders = new ViewHoders(view);
        return viewHoders;
    }
    @Override
    //填充onCreateViewHolder方法傳回的holder中的控件
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        ((ViewHoders) holder).tv.setText(datas[position]+position);

     //在此方法中來添加監聽,給li_layout控件添加監聽并設定上面我們接口中的兩個方法,在這隻是擷取位置。
        //注意,你可以在這裡直接Toast,也可以在主類調用我們的監聽方法。
        if(mOnItemClickListener!=null){
            ((ViewHoders) holder).li_layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context,"您點選了第:"+position+"個Item",Toast.LENGTH_SHORT).show();
//                    mOnItemClickListener.onClick(position);
                }
            });

            ((ViewHoders) holder).li_layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnItemClickListener.onLongClick(position);
                }
            });
        }

    }
    @Override
    public int getItemCount() {
        return datas.length;
    }
    //自定義ViewHolder,
    /*
    * RecylerView封裝了viewholder的回收複用,也就是說RecylerView标準化了ViewHolder,編寫Adapter面向的是ViewHolder而不再是View了
    * */
    class ViewHoders extends RecyclerView.ViewHolder{
        private TextView tv;
        private LinearLayout li_layout;

        public ViewHoders(View itemView) {
            super(itemView);
            tv= (TextView) itemView.findViewById(R.id.textview);
            li_layout= (LinearLayout) itemView.findViewById(R.id.li_layout);
        }
    }
}
           
  • 主類代碼
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private RecyclerView recy_view;
    private String[] data ={"我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大"};
    private ViewHoderAdaapters adaapters;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recy_view= (RecyclerView)findViewById(R.id.recy_view);
        LinearLayoutManager LM = new LinearLayoutManager(this);
        recy_view.setLayoutManager(LM);

        //樣式一,對應類DividerItemDecoration01
//        recy_view.addItemDecoration(new DividerItemDecoration01(this,LinearLayoutManager.HORIZONTAL));
        //樣式二,對應類DividerItemDecoration02
        recy_view.addItemDecoration(new DividerItemDecoration02(this,LinearLayoutManager.HORIZONTAL,R.drawable.style02));
        recy_view.setItemAnimator(new DefaultItemAnimator());

        adaapters = new ViewHoderAdaapters(MainActivity.this,data);

        adaapters.setOnItemListener(new ViewHoderAdaapters.OnItemClickListener() {
            public void onLongClick(int position) {
                Toast.makeText(MainActivity.this,"您點選了第:"+position+"個Item",Toast.LENGTH_SHORT).show();
            }

            public void onClick(int position) {
                Toast.makeText(MainActivity.this,"您點選了第:"+position+"個Item",Toast.LENGTH_SHORT).show();
            }
        });
        recy_view.setAdapter(adaapters);
    }


}
           

demo位址:http://download.csdn.net/detail/bobo8945510/9657739(帶自定義分割線代碼,承接自上一篇部落格)

demo位址:http://download.csdn.net/detail/bobo8945510/9657739(清理後,不帶自定義分割先代碼,為了讓大家更清晰的了解監聽,是以去掉了自定義部分代碼)