关于RecyclerView的随笔

来源:互联网 发布:网上买白酒 知乎 编辑:程序博客网 时间:2024/05/02 21:02

最近在研究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
原创粉丝点击