最近在研究RecyclerView,因为项目中有个横向的图片滑动,第一想法用listview,最后想了想用5.0新推出的这个控件试试看吧
1.第一步你可以选择自定义控件达到最好的效果,也可以像我这样把它直接写到布局中
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <android.support.v7.widget.RecyclerView
- android:id="@+id/id_recyclerview_horizontal"
- android:layout_width="match_parent"
- android:layout_height="120dp"
- android:layout_centerVertical="true"
- android:background="#FF0000"
- android:scrollbars="none" />
- </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了。