如何自定义RecyclerView的点击事件和绘制分割线-高级UI

一,高逼格的路途还很长,喜欢技术的都进来看看。如果我写博客的对你没有用而且你觉得我这文章没逼格,我会努力让以后文章更有内涵更有逼格的。

RecyclerView的特点:
1,谷歌在高版本提出一个新的代替ListView,GridView的控件。那就是
高逼格RecyclerView.
2,给RecyclerView设置布局管理器就可以实现GridView和ListView以及
瀑布流等效果。不得不说高度解耦谷歌做的确实很棒。
3.自带了性能优化。ViewHolder。
RecyclerView缺点:
1.使用过RecyclerView的同学也知道他并没有提供 像ListView和
GridView…的setOnItemClickListener和setOnLongClickListener事
件。
2.RecyclerView谷歌工程师并没有提供分割线,在ListView里面我们可
以设置分割线通过setDivide设置(好像是),你们自己试试,有点忘
记了。一会儿敲代码试试好像是这个方 法。不知道谷歌工程师则么想
的。烦死了。当然我相信很多小伙伴们都会说我们只需要在item布局
里面设置一个View来占位。在小公司也许就你一个人担任着android开
发,也许行得通,但是在大公司你这个会被笑死的。对于一个View在
布局里面每次从新绘制,在性能方面是不可取的。

二,我们来一一解决RecyclerView的缺点:
1)来设置点击事件和长按事件:
一般的RecyclerView的数据展示我相信都会吧!这里直接贴代码
了,一个Activity,一个适配器。
MainActivity:

public class MainActivity extends AppCompatActivity {
    private RecyclerView mRecylerview;
    private MyRecyclerAdapter mAdapter;
    private ArrayList<String> mList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        setData();
    }
    private void setData() {
        mAdapter = new MyRecyclerAdapter(mList);
        //LayoutManager布局管理器,控制摆放:线性摆放,
        mRecylerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        mRecylerview.setAdapter(mAdapter);
    }
    private void initData() {
        for (int i = 0; i < 30; i++) {
            mList.add("item" + i);
        }
    }

    private void initView() {
        mRecylerview = (RecyclerView) findViewById(R.id.recyle_view);
        mList = new ArrayList<>();
    }
}

适配器代码:MyRecyclerAdapter:

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHoler> {
    private List<String> mList;
    private ListView mListview;
    public MyRecyclerAdapter(ArrayList<String> mList) {
        this.mList = mList;
    }

    @Override
    public MyViewHoler onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        //创建ViewHorlder
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, null);
        MyViewHoler myViewHoler = new MyViewHoler(view);
        return myViewHoler;
    }

    @Override
    public void onBindViewHolder(MyViewHoler holder, final int position) {

        //绑定数据:
        holder.mTv.setText(mList.get(position));
    }

    @Override
    public int getItemCount() {
        return mList == null ? 0 : mList.size();
    }

    class MyViewHoler extends RecyclerView.ViewHolder {
        private TextView mTv;

        public MyViewHoler(View itemView) {
            super(itemView);
            mTv = (TextView) itemView.findViewById(R.id.tv_item);
        }
    }

}

如图下所示:
这里写图片描述

既然谷歌不提供我们OnItemClickListener那我们自己来设置:
我们可以在适配器中来设置监听ItemView的点击事件,通过接口来回调让通知Activity进行进行对应的操作。

那么我们首先在适配器中定义一个接口:

interface OnItemClickListener {
        void onItemClickListener(View view,int position);
    }

并且设置一个方法用来进行回调:

 public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

当我们在onBindViewHolder赋值完成之后可以获取itemView的监听事件
,当触发时候来触发接口方法,这里代码如下:

@Override
    public void onBindViewHolder(MyViewHoler holder, final int position) {

     //绑定数据:
     holder.mTv.setText(mList.get(position));
     //这里设置每个ItemView的监听事件,然后触发我们自定义接口方法实现回调。
     holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        onItemClickListener.onItemClickListener(v,position);
            }
        });
    }

最后在Activity里面设置监听事件进行回调:

mAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClickListener(View view, int position) {
                Toast.makeText(MainActivity.this,"我是第:"+position+"条item", Toast.LENGTH_SHORT).show();
            }
        });

结果如图所示:
这里写图片描述

这里我们就完成了点击事件了,那么长按事件你自己也就会写了吧。

2)接下来了我们实现一个点击删除和添加指定的item功能然后宝宝就要睡觉了!明天如果有时间就继续写分割线的绘制:现在是23点48啦!
先上效果图片:

同样我们可以在适配器里面设置addList()和removeList()方法:
代码如下:

 public void addList(String message, int position) {
        mList.add(position, message);
        notifyDataSetChanged();
    }

    public void removeList(int position) {
        mList.remove(position);
        notifyDataSetChanged();
    }

在Activity里面直接设置点击事件调用效果如图所示:

这里写图片描述

当然了RecyclerView谷歌设置了很多的解决数据监听的方法
什么notifyItemInserted(position);notifyItemRemoved(position); notifyItemRangeChanged(int ,int);范围性更新..等方法,而且他会有动画效果。这里我也测试过在添加数据时候如果position为0那么添加的内容就这0以上看不见的,只有滑动之后才可以,这个有点烦,需要自己去测量滑动距离进行设置也可以实现刷新展现数据的。如果有时间就好好研究研究源码。真ta码6b。
测试代码如下:

 public void addList(String message, int position) {
        mList.add(position, message);
        //notifyDataSetChanged();
        notifyItemInserted(position);
       // notifyItemRangeChanged(int ,int);
    }

    public void removeList(int position) {
        mList.remove(position);
        notifyDataSetChanged();
       notifyItemRemoved(position);
    }

效果图看看动画就可以:

这里写图片描述

下面贴上源码地址:需要自己下载哦!以后保证每篇博客都附上下载地址。
这jb gitHub晚上不开放么?没法登陆!上传百度云盘了。自行下载哦!

http://pan.baidu.com/s/1ge9cOoF

睡觉去了明天上班呀!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值