关于RecyclerView的随笔

最近在研究RecyclerView,因为项目中有个横向的图片滑动,第一想法用listview,最后想了想用5.0新推出的这个控件试试看吧

1.第一步你可以选择自定义控件达到最好的效果,也可以像我这样把它直接写到布局中

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <android.support.v7.widget.RecyclerView  
  7.         android:id="@+id/id_recyclerview_horizontal"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="120dp"  
  10.         android:layout_centerVertical="true"  
  11.         android:background="#FF0000"  
  12.         android:scrollbars="none" />  
  13.   
  14. </RelativeLayout>  (注:没有包的要添加v7包,注意版本,这是很多导致控件不出来的原因!
        compile 'com.android.support:appcompat-v7:23.3.0'会自动在build下面生成

2.给它添加item布局 原理和listview一样,根据你实际的项目需求添加想要的控件

3.建造适配器,主要有三个方法getItemCount()获取总条数,onCreateViewHolder()创建ViewHolder(这点貌似和listview一样做了优化复用的view,而在RecyclerView是把ViewHolder作为缓存单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,这就相当于listview中的getView()复用ViewHolder),onBindViewHolder()将数据绑定至ViewHolder。所以创建适配器的时候要继承RecyclerView.ViewHolder 下面是代码。


public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private Context context;
    private ArrayList<RecyclerView_data>arrayList;
    private ImageView iv_zhuye_yisheng_img;
    private OnItemClickLitener mOnItemClickLitener;
    /**
     * ItemClick的回调接口
     * @author zhy
     *
     */
    public interface OnItemClickLitener
    {
        void onItemClick(View view, int position,int which);
    }


    public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
    {
        this.mOnItemClickLitener = mOnItemClickLitener;
    }

    public RecyclerViewAdapter(Context context,ArrayList<RecyclerView_data>arrayList) {
        this.context = context;
        this.arrayList=arrayList;
    }
    
    @Override
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item,parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        viewHolder.iv_zhuye_yisheng_img = (ImageView) view.findViewById(R.id.iv_zhuye_yisheng_img);
        viewHolder.tv_zhuye_yisheng_name= (TextView) view.findViewById(R.id.tv_zhuye_yisheng_name);
        viewHolder.tv_zhuye_yisheng_department= (TextView) view.findViewById(R.id.tv_zhuye_yisheng_department);
        viewHolder.ll_yuyue= (LinearLayout) view.findViewById(R.id.ll_yuyue);
        return viewHolder;
}

    @Override
    public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder holder, final int position) {
        holder.tv_zhuye_yisheng_name.setText(arrayList.get(position).getName());
        holder.tv_zhuye_yisheng_department.setText(arrayList.get(position).getDepartment());
        iv_zhuye_yisheng_img=holder.iv_zhuye_yisheng_img;
        Glide.with(context).load(arrayList.get(position).getThumb()).placeholder(R.mipmap.yingyongtubiao).diskCacheStrategy(DiskCacheStrategy.ALL).into(iv_zhuye_yisheng_img);
       /**给imageView设置监听跳转到医生详情界面
        * */
        iv_zhuye_yisheng_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mOnItemClickLitener.onItemClick(holder.iv_zhuye_yisheng_img, position,0);
            }
        });
        /**给预约添加监听,跳转到预约界面
         * */
        holder.ll_yuyue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mOnItemClickLitener.onItemClick(holder.ll_yuyue, position,1);
            }
        });
    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View itemView) {
            super(itemView);
        }
        ImageView iv_zhuye_yisheng_img;
        TextView tv_zhuye_yisheng_name,tv_zhuye_yisheng_department;
        LinearLayout ll_yuyue;
    }
又因为RecyclerView没有setOnItemClickLitener()来监听他的item,所以在Adapt里面写了接口以便于回调。

4.调用其适配器,实现监听item

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(linearLayoutManager);

这是和listview不一样的地方,它多了个LinearLayoutManager,而且这个必须先设置不然会出错,可以设置为水平或垂直。

然后设置设配器

recyclerViewAdapter = new RecyclerViewAdapter(HomepageActivity.this, arrayList);
recyclerView.setAdapter(recyclerViewAdapter);
要是你的数据从网页上下载的,还需要调用
recyclerViewAdapter.notifyDataSetChanged();
来更新适配器数据(我就是前面没调用,出现加载不出来,好烦。我用的okhttp解析)

接下来监听

recyclerViewAdapter.setOnItemClickLitener(new RecyclerViewAdapter.OnItemClickLitener() {
    @Override
    public void onItemClick(View view, int position,int which) {
        switch (which){
            case 0:
                Toast.makeText(HomepageActivity.this,"aaaaaaa",Toast.LENGTH_SHORT).show();
                break;
            case 1:
                startActivity(new Intent(HomepageActivity.this,YuyueActivity.class));
                break;
        }
    }
});
int which 就是你item里面的控件,这样你就可以点击里面的控件干不同的事情了。


这样就完成了一个横向recyclerView,和分别点击其item控件干不同事情的demo了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值