Recyclerview加点击和长按点击事件布局和Recyclerview一样

MainActivity

package com.bw.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //listview
        findViewById(R.id.lsit_rcv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //跳转页面
                Intent intent=new Intent(MainActivity.this,RecyclerviewActivity.class);
                //intent携带值
                intent.putExtra("type",1);
                //跳转
                startActivity(intent);
            }
        });
        //gridview
        findViewById(R.id.grid_rcv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(MainActivity.this,RecyclerviewActivity.class);
                intent.putExtra("type",2);
                startActivity(intent);
            }
        });
        //瀑布流
        findViewById(R.id.Sta_rcv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(MainActivity.this,RecyclerviewActivity.class);
                intent.putExtra("type",3);
                startActivity(intent);
            }
        });
    }
}


RecyclerviewActivity类
package com.bw.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Toast;

import com.bw.adapter.RecyclerviewAdapter;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;

public class RecyclerviewActivity extends AppCompatActivity {

    @Bind(R.id.RecyclerView)
    RecyclerView mRecyclerView;
    List<String> list=new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recyclerview);
        ButterKnife.bind(this);
        //为list集合添加数据
        for (int i=0;i<20;i++){
            list.add("满心好事"+i);
        }
        //判断mainactivity传来值,设置mRecyclerView的布局管理器
        if (getIntent().getIntExtra("type",0)==1){
            /**RecyclerView提供了三种内置的LayoutManager:
             * LinearLayoutManager:线性布局,横向或者纵向滑动列表
             * GridLayoutManager:表格布局,支持水平和垂直效果
             * StaggeredGridLayoutManager:流式布局
             */
            //线性布局管理器,参数是本activity的对象
            LinearLayoutManager mLayoutManager=new LinearLayoutManager(this);
            //设置线性布局的方向(Orientation:方向)
            // 参数:LinearLayoutManager.VERTICAL(垂直)或HORIZONTAL(水平)
            mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            //这个方法可写可不写setHasFixedSize(true)
            //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
            mRecyclerView.setHasFixedSize(true);
            //为Recycleview设置线性布局管理器
            mRecyclerView.setLayoutManager(mLayoutManager);
        }else if (getIntent().getIntExtra("type",0)==2){
            //为Recycleview设置表格布局管理器
            //参数1:本activity的对象,参数2:表格布局的列数
            mRecyclerView.setLayoutManager(new GridLayoutManager(this,2));
        }else if (getIntent().getIntExtra("type",0)==3){
            //参数1:列数,参数2:VERTICAL(垂直)或HORIZONTAL(水平)等
            mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));
        }
        RecyclerviewAdapter mAdapter=new RecyclerviewAdapter(this,list);
        //绑定适配器
        mRecyclerView.setAdapter(mAdapter);
        //设置点击事件
        mAdapter.setOnItemClickListener(new RecyclerviewAdapter.OnRecyclerViewItemClickListener() {
            @Override
            public void onItemClick(View view, String data) {
                Toast.makeText(RecyclerviewActivity.this, data, Toast.LENGTH_SHORT).show();
            }
        });
        //设置长按点击事件
        mAdapter.setOnItemLongClickListener(new RecyclerviewAdapter.MyItemLongClickListener() {
            @Override
            public void onItemLongClick(View view, String data) {
                Toast.makeText(RecyclerviewActivity.this, data, Toast.LENGTH_SHORT).show();

            }
        });
    }
}
RecyclerviewAdapter类
package com.bw.adapter;

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.TextView;

import com.bw.activity.R;

import java.util.List;

/**
 * 实现条目点击事件:实现了点击接口
 */
public class RecyclerviewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>  implements View.OnClickListener,View.OnLongClickListener{
    LayoutInflater mLayoutInflater;
    Context context;
    List<String> list;
    //自定义内部接口的对象(点击)
    private OnRecyclerViewItemClickListener mOnItemClickListener = null;
    //自定义内部接口的对象(长按点击)
    private MyItemLongClickListener mLongClickListener=null;
    /**
     * 点击接口回调
     */
    //实现条目点击事件用的方法
    //define(定义) interface(接口)
    public static interface OnRecyclerViewItemClickListener {
        //两个参数可改(自定义)
        void onItemClick(View view , String data);
    }
    //提供的对外调用setOnItemClickListener的方法,参数是内部接口
    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }

    //点击方法(实现的是实现的接口的抽象方法)
    //点击的实现靠它,因为它是实现的点击方法
    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            //(内部点击接口)注意这里使用getTag方法获取数据
            //参数对应内部点击接口参数一致
            mOnItemClickListener.onItemClick(v,(String)v.getTag());
        }
    }

    /**
     * 长按点击接口回调
     */
     //长按监听
    @Override
    public boolean onLongClick(View v) {
        if(mLongClickListener != null){
            mLongClickListener.onItemLongClick(v, (String)v.getTag());
        }
        return true;
    }
    //长按接口
    public interface MyItemLongClickListener {
         void onItemLongClick(View view,String data);
    }
    //对外的调用长按点击的方法
    public void setOnItemLongClickListener(MyItemLongClickListener listener){
        this.mLongClickListener = listener;
    }
    /**
     * ① 枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量。因为是常量,所以不能对枚举元素进行赋值。
     * ② 枚举元素作为常量,它们是有值的,C 语言在编译时按定义的顺序使它们的值为,1,2,…。
     * enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}day;
     * 这时,sun 为 7,mon 为 1,以后元素顺次加 1,所以 sat 就是 6 了。
     */
    //建立枚举 2个item 类型(里面的)
    public enum ITEM_TYPE {
        ITEM1,
        ITEM2,
        ITEM3
    }
    //有参实例化
    public RecyclerviewAdapter(Context context, List<String> list) {
        this.context=context;
        this.list=list;
        //实例化LayoutInflater
        mLayoutInflater=LayoutInflater.from(context);
    }

    /**
     *该方法中导入布局,实例化VIewHolder
     * @param parent 相当于一个容器
     * @param viewType 第二个参数就是View的类型,可以根据这个类型判断去创建不同item的ViewHolder。
     * @return  ViewHolder对象
     */
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //枚举的用法
        if (viewType==ITEM_TYPE.ITEM1.ordinal()){
            //加载Item View的时候根据不同TYPE加载不同的布局
            View view=mLayoutInflater.inflate(R.layout.item1,parent,false);
            //实例化Item1ViewHolder
            Item1ViewHolder vh=new Item1ViewHolder(view);
            //将创建的View注册点击事件
            // (因为view代表的是条目布局,它是一个条目,为它注册了点击监听,
            // 在它被加载后就是每一个条目都有了监听)
            view.setOnClickListener(this);
            //将创建的View注册长按点击事件(就Item1ViewHolder注册了)
            view.setOnLongClickListener(this);
            return vh;
        }else if (viewType==ITEM_TYPE.ITEM2.ordinal()){
            //加载Item View的时候根据不同TYPE加载不同的布局
            View view=mLayoutInflater.inflate(R.layout.item2,parent,false);
            //实例化Item1ViewHolder
            Item2ViewHolder vh=new Item2ViewHolder(view);
            //将创建的View注册点击事件
            view.setOnClickListener(this);
            return vh;
        }else{
            //加载Item View的时候根据不同TYPE加载不同的布局
            View view=mLayoutInflater.inflate(R.layout.item3,parent,false);
            //实例化Item1ViewHolder
            Item3ViewHolder vh=new Item3ViewHolder(view);
            //将创建的View注册点击事件
            view.setOnClickListener(this);
            return vh;
        }
    }

    /**
     *绑定VIewHolder,加载数据
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof Item1ViewHolder){
            ((Item1ViewHolder) holder).mTextView.setText(list.get(position));
            //将数据保存在itemView的Tag中,以便点击时进行获取
            holder.itemView.setTag(list.get(position));
        }else if (holder instanceof Item2ViewHolder){
            ((Item2ViewHolder)holder).mTextView.setText(list.get(position));
            //将数据保存在itemView的Tag中,以便点击时进行获取
            holder.itemView.setTag(list.get(position));
        }else if (holder instanceof Item3ViewHolder){
            ((Item3ViewHolder)holder).mTextView.setText(list.get(position));
            //将数据保存在itemView的Tag中,以便点击时进行获取
            holder.itemView.setTag(list.get(position));
        }
    }

    /**
     * 获取数据源的个数
     * @return 总条目数
     */
    @Override
    public int getItemCount(){
        //返回list.size()也可以
        return list == null ? 0 : list.size();
    }
    /**
     * item1的ViewHolder
     * 自定义的ViewHolder,持有每个Item的的所有界面元素
     */
    public static  class Item1ViewHolder extends RecyclerView.ViewHolder{
        //item中的控件ID
        TextView mTextView;
        public Item1ViewHolder(View itemView) {
            super(itemView);
            mTextView= (TextView) itemView.findViewById(R.id.item1_list);
        }
    }
    /**
     * item2的ViewHolder
     * 自定义的ViewHolder,持有每个Item的的所有界面元素
     */
    public static  class Item2ViewHolder extends RecyclerView.ViewHolder{
        //item中的控件ID
        TextView mTextView;
        public Item2ViewHolder(View itemView) {
            super(itemView);
            mTextView= (TextView) itemView.findViewById(R.id.item2_grid);
        }
    }
    /**
     * item3的ViewHolder
     * 自定义的ViewHolder,持有每个Item的的所有界面元素
     */
    public static  class Item3ViewHolder extends RecyclerView.ViewHolder{
        //item中的控件ID
        TextView mTextView;
        public Item3ViewHolder(View itemView) {
            super(itemView);
            mTextView= (TextView) itemView.findViewById(R.id.item3_sta);
        }

    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值