Recyclerview在项目中由浅到深的使用
2016-08-19 09:47
429 查看
最简单的Recyclerview
Recyclerview跟ListView一样,也需要写适配器,只是,它的适配器跟ListView有点差别:public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.ViewHolder> { private Context context; private List<DataBean.ResultBean.FutureBean> list = new ArrayList<>(); public SimpleAdapter(Context context, List<DataBean.ResultBean.FutureBean> list) { this.context = context; this.list = list; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_rv_simple, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { DataBean.ResultBean.FutureBean futureBean = list.get(position); holder.tvTime.setText(futureBean.getDate() + " " + futureBean.getWeek()); holder.tvWind.setText("风力:" + futureBean.getWind()); holder.tvTemperature.setText("温度:" + futureBean.getTemperature()); holder.tvWeather.setText("天气:"+futureBean.getWeather()); } @Override public int getItemCount() { return list.size(); } static class ViewHolder extends RecyclerView.ViewHolder { @Bind(R.id.tv_time) TextView tvTime; @Bind(R.id.tv_weather) TextView tvWeather; @Bind(R.id.tv_wind) TextView tvWind; @Bind(R.id.tv_temperature) TextView tvTemperature; ViewHolder(View view) { super(view); ButterKnife.bind(this, view); } } }
Recyclerview的显示方式,是通过布局管理器LayoutManager来控制的,LinearLayoutManager能让Recyclerview像ListView般显示,通过控制LayoutManager的方向可以实现,垂直的列表或者水平滚动的列表;而GridLayoutManager能让Recyclerview像Gridview般显示,一行显示几个也可以控制;
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
给Recyclerview设置Adapter之前必须要先设置好LayoutManager,然后就可以设置Adapter了:
DataBean dataBean = (DataBean) T; List<DataBean.ResultBean.FutureBean> list = dataBean.getResult().getFuture(); mList.addAll(list); if (adapter == null) { adapter = new SimpleAdapter(this, mList); rvSimple.setAdapter(adapter); } else { adapter.notifyDataSetChanged(); }
Recyclerview的点击事件
Recyclerview整个item的点击事件Recyclerview并不像Listview一样可以直接添加子项点击事件;Recyclerview官方没有提供OnItemClickListener接口,所以Recyclerview想要实现点击事件,就得自己重写点击事件。
首先,写一个公共的接口,供所有的Recyclerview调用实现点击事件;
public interface MyItemClickListener { void onItemClick(View view, int postion); }
然后在Recyclerview的Adapter里面的ViewHolder添加view的点击事件:
static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { @Bind(R.id.tv_time) TextView tvTime; @Bind(R.id.tv_weather) TextView tvWeather; @Bind(R.id.tv_wind) TextView tvWind; @Bind(R.id.tv_temperature) TextView tvTemperature; MyItemClickListener listener; ViewHolder(View view, MyItemClickListener listener) { super(view); ButterKnife.bind(this, view); this.listener = listener; view.setOnClickListener(this); } @Override public void onClick(View v) { listener.onItemClick(v, getAdapterPosition()); } } public void setListener(MyItemClickListener listener) { this.listener = listener; }
在Activity中,先实现点击事件接口里面的方法,然后在创建Adapter之后,实现Adapter中的方法;就可以实现Recyclerview子项的点击事件了;
adapter.setListener(this); @Override public void onItemClick(View view, int postion) { Toast.makeText(context, "我是第" + postion + "项", Toast.LENGTH_SHORT).show(); }
2.Recyclerview Item中某个控件的点击事件
项目中偶尔会遇到,一个列表,不仅Item可以点击,Item里面的某个控件也可以点击;这时候,需要同时实现Recyclerview的多个点击事件,方法与前面类似,只不过在接口中添加多一个参数;
效果图如下:
全局的接口有所改变;
public interface MyItemClickTypeListener { void onItemClick(View view, int type , int postion); }
Adapter中的ViewHolder的写法;
static class ViewHolder extends RecyclerView.ViewHolder { @Bind(R.id.iv_head) CircleImageView ivHead; @Bind(R.id.tv_name) TextView tvName; @Bind(R.id.tv_myag_two) TextView tvMyagTwo; @Bind(R.id.tv_myag_three) TextView tvMyagThree; @Bind(R.id.ll_edit) LinearLayout llEdit; @Bind(R.id.ll_delete) LinearLayout llDelete; private MyItemClickTypeListener listener; ViewHolder(View view, MyItemClickTypeListener listener) { super(view); ButterKnife.bind(this, view); this.listener = listener; llEdit.setOnClickListener(new myClick(1)); view.setOnClickListener(new myClick(2)); llDelete.setOnClickListener(new myClick(3)); } class myClick implements View.OnClickListener { int index = 0; public myClick(int i) { this.index = i; } @Override public void onClick(View v) { listener.onItemClick(v, index , getAdapterPosition()); } } } } public void setListener(MyItemClickTypeListener listener) { this.listener = listener; }
在Activity中实现接口的方法:
@Override public void onItemClick(View view, int type, int postion) { Intent intent = new Intent(); MyAGBean.ResultsBean.ListBean myAGBean = mList.get(postion - 1); switch (type) { case 1: new ExitDialog(MyAGActivity.this, "确认删除求货?", postion - 1, this); break; case 2: new ExitDialog(MyAGActivity.this, "确认删除求货?", postion - 1, this); break; case 3: new ExitDialog(MyAGActivity.this, "确认删除求货?", postion - 1, this); break; } }
用Recyclerview实现二级列表
项目之中可能会遇到二级列表的情况,简单来说,就是,一个列表的子项包含着一个列表;如图:这里我的实现方式是用Recyclerview嵌套Recyclerview的方式,首先,列表Item里面的Recyclerview,它的Item的布局只是个简单的图片+文字;Adapter也是简单的Recyclerview的Adapter的写法,没什么特别;而一级列表的Item则是由一些控件加上一个Recyclerview构成;
xml布局代码:
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/margin_20" android:foreground="?android:attr/selectableItemBackground" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white"> <com.android.volley.toolbox.NetworkImageView android:id="@+id/iv_xrv_market_shop" android:layout_width="@dimen/margin_60" android:layout_height="@dimen/margin_60" android:layout_margin="@dimen/margin_10" android:background="@mipmap/ic_user_loading" android:scaleType="fitCenter" /> <TextView android:id="@+id/tv_xrv_market_shop_title" style="@style/text_black_16" android:layout_alignTop="@+id/iv_xrv_market_shop" android:layout_margin="@dimen/margin_5" android:layout_toRightOf="@+id/iv_xrv_market_shop" android:text="我是标题" /> <TextView android:id="@+id/tv_xrv_market_shop_info" style="@style/text_gray_16" android:layout_width="match_parent" android:layout_alignLeft="@+id/tv_xrv_market_shop_title" android:layout_below="@+id/tv_xrv_market_shop_title" android:layout_marginBottom="@dimen/margin_10" android:layout_toLeftOf="@+id/ll_fans" android:text="我是内容" android:textColor="@color/color_two_text" android:textSize="@dimen/text_size_14" /> <LinearLayout android:id="@+id/ll_fans" android:layout_width="wrap_content" android:layout_height="@dimen/margin_43" android:layout_alignParentRight="true" android:layout_marginRight="@dimen/margin_18" android:background="@drawable/btn_bg" android:layout_alignTop="@+id/tv_xrv_market_shop_title" android:layout_marginTop="@dimen/margin_4" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="@dimen/margin_0" android:layout_weight="1" android:drawableLeft="@mipmap/ic_market_fans" android:gravity="center" android:text="粉丝" android:textColor="@color/white" android:textSize="@dimen/text_size_12" /> <TextView android:id="@+id/tv_xrv_market_shop_fans" android:layout_width="match_parent" android:layout_height="@dimen/margin_0" android:layout_weight="1" android:gravity="center" android:paddingTop="@dimen/margin_2" android:text="100人" android:textColor="@color/white" android:textSize="@dimen/text_size_12" /> </LinearLayout> <ImageView android:id="@+id/iv_xrv_market_shop_like" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> <android.support.v7.widget.RecyclerView android:id="@+id/gv_xrv_market_shop" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="@dimen/margin_5" android:background="@color/white" /> <View android:layout_width="match_parent" android:layout_height="@dimen/margin_0.5" android:background="@color/color_view" /> <TextView android:id="@+id/tv_xrv_market_shop_in" android:layout_width="match_parent" android:layout_height="@dimen/margin_50" android:background="@color/white" android:gravity="center" android:text="进入店铺" android:textColor="@color/colorPrimary" android:textSize="@dimen/text_size_16" /> </LinearLayout> </android.support.v7.widget.CardView>
二级列表还有一个需要注意的点,就是第二级列表子项的点击事件,跟之前的点击事件有点区别;首先需要在二级列表的Adapter写一个接口可供一级列表的Adapter调用,并实现点击事件:
public class MarketShopGvAdapter extends RecyclerView.Adapter<MarketShopGvAdapter.ViewHolder> { private Context context; private TwoListener twoListener; private ImageLoader imageLoader; private List<MarketShopBean.ResultsBean.DataBean.ListBean> list = new ArrayList<>(); public MarketShopGvAdapter(Context context, List<MarketShopBean.ResultsBean.DataBean.ListBean> list) { this.context = context; this.list = list; RequestQueue queue = Volley.newRequestQueue(context); imageLoader = new ImageLoader(queue, new BitmapCache()); } //供一级列表调用的接口 interface TwoListener { void setTwoListener(View view, int two); } public void setTwoListener(TwoListener twoListener) { this.twoListener = twoListener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_gv_title_img, parent, false); ViewHolder viewHolder = new ViewHolder(view,twoListener); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.ivGv.setErrorImageResId(R.mipmap.ic_erro_download_small); holder.ivGv.setDefaultImageResId(R.mipmap.ic_download_small); //根据屏幕分辨率设置图片宽高 holder.ivGv.setImageUrl(list.get(position).getImg() + "/" + BaseMethod.getSwidth((Activity) context) / 3 + "/" + BaseMethod.getSwidth((Activity) context) / 4.8, imageLoader); holder.tvGvTitle.setText(list.get(position).getShow()); } @Override public int getItemCount() { return list.size(); } static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { @Bind(R.id.iv_gv) NetworkImageView ivGv; @Bind(R.id.tv_gv_title) TextView tvGvTitle; TwoListener twoListener; ViewHolder(View view, TwoListener twoListener) { super(view); ButterKnife.bind(this, view); this.twoListener = twoListener; //实现点击事件 view.setOnClickListener(this); } @Override public void onClick(View v) { twoListener.setTwoListener(v, getAdapterPosition()); } } }
然后在一级列表的Adapter里面要实现两个方法供Activity调用:
public class MarketShopAdapter extends RecyclerView.Adapter<MarketShopAdapter.ViewHolder> { private Context context; private ImageLoader imageLoader; private OneListener oneListener; private MyItemClickListener listener; private List<MarketShopBean.ResultsBean.DataBean> list = new ArrayList<>(); public MarketShopAdapter(Context context, List<MarketShopBean.ResultsBean.DataBean> list) { this.context = context; this.list = list; RequestQueue queue = Volley.newRequestQueue(context); imageLoader = new ImageLoader(queue, new BitmapCache()); } //实现二级列表点击事件的接口,供Activity调用 public interface OneListener { void setOneListener(View view, int one, int two); } public void setOneListener(OneListener oneListener) { this.oneListener = oneListener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_xrv_market_shop, parent, false); ViewHolder viewHolder = new ViewHolder(view, listener); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { final int k = position; MarketShopBean.ResultsBean.DataBean dataBean = list.get(position); holder.ivXrvMarketShop.setErrorImageResId(R.mipmap.ic_user_loading); holder.ivXrvMarketShop.setDefaultImageResId(R.mipmap.ic_user_loading); holder.ivXrvMarketShop.setImageUrl(dataBean.getImg(), imageLoader); holder.tvXrvMarketShopTitle.setText(dataBean.getShop()); if (dataBean.getInfo().isEmpty()) { holder.tvXrvMarketShopInfo.setText("这个人很懒,什么都没留下~"); } else { holder.tvXrvMarketShopInfo.setText(dataBean.getInfo()); } if (dataBean.getFans().isEmpty()) { holder.llFans.setVisibility(View.GONE); } else { holder.tvXrvMarketShopFans.setText(dataBean.getFans() + "人"); } GridLayoutManager manager = new GridLayoutManager(context, 3); holder.gvXrvMarketShop.setLayoutManager(manager); MarketShopGvAdapter adapter = new MarketShopGvAdapter(context, list.get(position).getList()); holder.gvXrvMarketShop.setAdapter(adapter); //实现回调 MarketShopGvAdapter.TwoListener twoListener = new MarketShopGvAdapter.TwoListener() { @Override public void setTwoListener(View view, int two) { oneListener.setOneListener(view, k, two); } }; adapter.setTwoListener(twoListener); } @Override public int getItemCount() { return list.size(); } static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { @Bind(R.id.ll_fans) LinearLayout llFans; @Bind(R.id.iv_xrv_market_shop) NetworkImageView ivXrvMarketShop; @Bind(R.id.tv_xrv_market_shop_title) TextView tvXrvMarketShopTitle; @Bind(R.id.tv_xrv_market_shop_info) TextView tvXrvMarketShopInfo; @Bind(R.id.tv_xrv_market_shop_fans) TextView tvXrvMarketShopFans; @Bind(R.id.iv_xrv_market_shop_like) ImageView ivXrvMarketShopLike; @Bind(R.id.gv_xrv_market_shop) RecyclerView gvXrvMarketShop; @Bind(R.id.tv_xrv_market_shop_in) TextView tvXrvMarketShopIn; MyItemClickListener listener; ViewHolder(View view, MyItemClickListener listener) { super(view); ButterKnife.bind(this, view); this.listener = listener; //一级列表的点击事件 view.setOnClickListener(this); } @Override public void onClick(View v) { listener.onItemClick(v, getAdapterPosition()); } } public void setListener(MyItemClickListener listener) { this.listener = listener; } }
在Activity或Fragment中实现方法:
public class MarketShopFragment extends Fragment implements MarketShopAdapter.OneListener @Override public void setOneListener(View view, int one, int two) { Intent intent = new Intent(); intent.putExtra("img", mList.get(one).getList().get(two).getImg() + ""); intent.putExtra("gid", mList.get(one).getList().get(two).getGid() + ""); intent.putExtra("shopid", mList.get(one).getList().get(two).getShopid() + ""); intent.setClass(getActivity(), GoodsDetailActivity.class); startActivity(intent); }
多种Item的Recyclerview
当一个界面内容超过了手机屏幕,我们会选择用ScrollView,可滚动的布局,但是用过Scrollview的人都知道,Scrollview与Listview、GirdView、Recyclerview同时使用的时候,总会遇到各种各样的问题,谷歌官方也是不推荐我们将这几个控件与Scrollview同时使用。但是项目中,肯定会出现这些应用场景的,像我项目中遇到的一个界面,顶部是标题栏,然后就是viewpager切换的广告图,然后就是一个横屏滚动的列表,最下面的一个竖屏的列表,而且最下方的列表还需要做分页加载;像这样的一个界面,有几个解决办法:外层加Scrollview;
界面布局只有最底层一个列表,其他布局均作为列表的Header;
利用getItemViewType为列表设置不同的item;
第一种的应用肯定会遇到各种各样的冲突,解决办法只有遇到一个解决一个;
第二种也比较简单,代码如下:
View header = LayoutInflater.from(getActivity()).inflate(R.layout.list_article_viewpager, null); ViewPager view_pager = (ViewPager) header.findViewById(R.id.main_opearte_viewpager); LinearLayout ll_dian = (LinearLayout) header.findViewById(R.id.ll_dian); TextView tvTextview = (TextView) header.findViewById(R.id.tv_article_vp_title); //给viewpager设置adapter、布局设置属性等等 listView.addHeaderView(header);
第三种,getItemViewType也有两个使用方式;
上面提到的一个界面有viewpager,横屏列表,竖屏列表,等等几个模块;
一个列表里面有几种不同的item;
先以第一种为例,项目效果图如下:
从图中可以看出,中间部分的这个界面由一个Recyclerview实现,而这个Recyclerview分成三种不同的布局,也就是说这个Recyclerview只有三个Item,因为是三种布局,所以在写Recyclerview的Adapter的时候,需要写三个ViewHolder;
首先,先定义一个数组,这个Recyclerview有几种布局,数组长度就为多少;
private int[] ids = {1, 2, 3}; @Override public int getItemCount() { return ids.length; } @Override public int getItemViewType(int position) { return ids[position]; }
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder viewHolder = null; View view; switch (viewType) { case 1: view = LayoutInflater.from(context).inflate(R.layout.item_xrv_user_detail_one, parent, false); OneViewHolder oneViewHolder = new OneViewHolder(view); viewHolder = oneViewHolder; break; case 2: view = LayoutInflater.from(context).inflate(R.layout.item_xrv_user_detail_two, parent, false); TwoViewHolder twoViewHolder = new TwoViewHolder(view,listener); viewHolder = twoViewHolder; break; case 3: view = LayoutInflater.from(context).inflate(R.layout.item_rv_ud_ag, parent, false); ThreeViewHolder threeViewHolder = new ThreeViewHolder(view); viewHolder = threeViewHolder; break; } return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case 1: OneViewHolder oneViewHolder = (OneViewHolder) holder; if (infoResultsBean != null) { oneViewHolder.tvUdName.setText(infoResultsBean.getName()); } break; case 2: TwoViewHolder twoViewHolder = (TwoViewHolder) holder; if (resultsBean == null) { twoViewHolder.rlShop.setVisibility(View.GONE); } else { twoViewHolder.tvTitle.setText(resultsBean.getShop()); } break; case 3: ThreeViewHolder threeViewHolder = (ThreeViewHolder) holder; LinearLayoutManager manager = new LinearLayoutManager(context); manager.setOrientation(LinearLayoutManager.VERTICAL); threeViewHolder.rvItem.setLayoutManager(manager); if (adapter == null) { adapter = new UserAGAdapter(context, mList); threeViewHolder.rvItem.setAdapter(adapter); } else { adapter.notifyDataSetChanged(); } adapter.setListener(listener); break; } }
这里需要注意的是,需要在各个子Item所需要的数据都得到后才能设置Adapter,不然会残缺某一块。
然后就是,一个Recyclerview中,有着不同的item,大概情况如下图:
这种与上面的不同,它的item长度不是2,而是整个list的长度;我在数据中加入多一个参数,用来判别是哪种类型的item,数据结构如下:
整个Adapter的代码是这样的:
public class AllCircleAdapter extends RecyclerView.Adapter { private Context context; private ImageLoader imageLoader; private OneListener oneListener; private TwoListener twoListener; private List<AllCircleBean.ResultsBean.ListBean> list = new ArrayList<>(); public AllCircleAdapter(Context context, List<AllCircleBean.ResultsBean.ListBean> list) { this.context = context; this.list = list; RequestQueue queue = Volley.newRequestQueue(context); imageLoader = new ImageLoader(queue, new BitmapCache()); } public interface OneListener { void OneListener(View view, int position); } public interface TwoListener { void TwoListener(View view, int position); } public void setOneListener(OneListener oneListener) { this.oneListener = oneListener; } public void setTwoListener(TwoListener twoListener) { this.twoListener = twoListener; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder viewHolder = null; OneViewHolder oneViewHolder; TwoViewHolder twoViewHolder; View view; switch (viewType) { case 1: view = LayoutInflater.from(context).inflate(R.layout.item_xrv_all_circle_one, parent, false); oneViewHolder = new OneViewHolder(view, oneListener); viewHolder = oneViewHolder; break; case 2: view = LayoutInflater.from(context).inflate(R.layout.item_xrv_all_circle_two, parent, false); twoViewHolder = new TwoViewHolder(view, twoListener); viewHolder = twoViewHolder; break; } return viewHolder; } @SuppressLint("SetTextI18n") @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { AllCircleBean.ResultsBean.ListBean allCircleBean = list.get(position); switch (getItemViewType(position)) { case 1: OneViewHolder oneViewHolder = (OneViewHolder) holder; oneViewHolder.tvAllCircleTime.setText(allCircleBean.getGoods().getTime()); break; case 2: TwoViewHolder twoViewHolder = (TwoViewHolder) holder; AllCircleBean.ResultsBean.ListBean.GoodsBean goodsBean = allCircleBean.getGoods(); twoViewHolder.tvAllCircleTitle.setText(goodsBean.getShop()); break; } } @Override public int getItemCount() { return list.size(); } @Override public int getItemViewType(int position) { return list.get(position).getT(); } class OneViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { @Bind(R.id.iv_item_all_circle) CircleImageView ivItemAllCircle; @Bind(R.id.tv_all_circle_title) TextView tvAllCircleTitle; @Bind(R.id.tv_all_circle_info) TextView tvAllCircleInfo; @Bind(R.id.tv_all_circle_time) TextView tvAllCircleTime; private OneListener listener; OneViewHolder(View view, OneListener listener) { super(view); ButterKnife.bind(this, view); this.listener = listener; view.setOnClickListener(this); } @Override public void onClick(View v) { listener.OneListener(v, getAdapterPosition()); } } static class TwoViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { @Bind(R.id.iv_item_all_circle) CircleImageView ivItemAllCircle; @Bind(R.id.tv_all_circle_title) TextView tvAllCircleTitle; @Bind(R.id.tv_goods_name) TextView tvGoodsName; @Bind(R.id.tv_all_circle_info) TextView tvAllCircleInfo; @Bind(R.id.tv_type) TextView tvType; @Bind(R.id.tv_price) TextView tvPrice; @Bind(R.id.tv_shop) TextView tvShop; @Bind(R.id.gv_circle) RecyclerView gvCircle; @Bind(R.id.tv_all_circle_time) TextView tvAllCircleTime; TwoListener listener; TwoViewHolder(View view, TwoListener listener) { super(view); ButterKnife.bind(this, view); this.listener = listener; view.setOnClickListener(this); } @Override public void onClick(View v) { listener.TwoListener(v, getAdapterPosition()); } } }
Recyclerview的下拉刷新以及分页加载
Recyclerview的下拉刷新以及分页加载在这里推荐使用XRecyclerview,简单易用,样式多且好看;项目地址是:https://github.com/jianghejie/XRecyclerView
使用方法,在gradle中添加:
compile 'com.jcodecraeer:xrecyclerview:1.2.7'
xml中使用xRecyclerview:
<com.jcodecraeer.xrecyclerview.XRecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none" />
设置xRecyclerview的方式跟普通的Recyclerview一样:
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mAdapter);
然后就可以设置xRecyclerview的刷新与加载更多了:
mRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { //refresh data here } @Override public void onLoadMore() { // load more data here } });
如果刷新完成,则添加:
mRecyclerView.refreshComplete();
如果加载更多完成,则添加:
mRecyclerView.loadMoreComplete();
也可以通过代码设置下拉刷新以及上拉加载的样式:
mRecyclerView.setRefreshProgressStyle(int style); mRecyclerView.setLaodingMoreProgressStyle(int style); mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey); mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
当然也可以禁止下拉或者上拉:
mRecyclerView.setPullRefreshEnabled(false);
也可以自定义Header或者footer,甚至还可以添加多个Header:
View header = LayoutInflater.from(this).inflate(R.layout.recyclerview_header, (ViewGroup)findViewById(android.R.id.content),false); View header1 = LayoutInflater.from(this).inflate(R.layout.recyclerview_header1, (ViewGroup)findViewById(android.R.id.content),false); mRecyclerView.addHeaderView(header); mRecyclerView.addHeaderView(header1);
Recyclerview的批量删除
Recyclerview的批量删除里面,首先每个Item里面都有一个Checkbox,而且默认是隐藏的,只有点击删除按钮才会出现,效果图如下:所以这时候需要在Adapter里面添加一个全局静态变量,在activity中,通过点击按钮改变这个变量的值从而改变Recyclerview中的Checkbox的显隐状态;
//Aadpter中添加的变量 public static boolean isSee = false; //Adapter中,通过变量显示或隐藏CHeckbox if (isSee) { holder.cbDelete.setVisibility(View.VISIBLE); } else { holder.cbDelete.setVisibility(View.GONE); } //Activity中,点击按钮改变Checkbox的状态 if (adapter != null) { if (CollectListAdapter.isSee) { CollectListAdapter.isSee = false; } else { CollectListAdapter.isSee = true; } adapter.notifyDataSetChanged(); }
然后则需要在Adapter中添加多一个HashMap,来记录Recyclerview每一个Item中Checkbox的选中状态;
public static HashMap<Integer, Boolean> checked = new HashMap<>(); if (isSee) { holder.cbDelete.setChecked(checked.get(position) != null); }
在Activity中,同时需要一个HashMap来存放需要删除的值,比如说这个Recyclerview的item中的id等等,在Recyclerview的点击事件中,同时设置Adapter中的HashMap以及Activity中的HashMap;
if (CollectListAdapter.checked.get(postion - 1) == null) { CollectListAdapter.checked.put(postion - 1, true); selectlist.put(postion - 1, mList.get(postion - 1).getFid()); } else { CollectListAdapter.checked.remove(postion - 1); selectlist.remove(postion - 1); } adapter.notifyDataSetChanged();
selectlist中的String则是我们需要删除的数据,执行删除操作的时候将这些值传给服务器即可。
相关文章推荐
- Android 4.4Eclipse项目中使用RecyclerView
- RecyclerView封装——可以直接项目中使用,拿走不谢!
- glmis项目工作日志4_解决RecyclerView中使用CheckBox时出现数据错乱的问题。
- 手把手教你做开源项目MyMeiZi 二(使用RecyclerView+Glide打造瀑布流)
- 超高效的使用RecyclerView应对项目中的常见需求的Adapter。
- glmis项目工作日志1_使用RecyclerView_DrawerLayout全屏滑动_使用ButterKnife
- 商城项目实战 | 4.1 RecyclerView 使用完全解析 体验艺术般的控件(一)
- 商城项目实战 | 4.2 RecyclerView 使用完全解析 体验艺术般的控件(二)
- ANDROID L——RecyclerView,CardView导入和使用(Demo)
- 关于在SSH项目中使用OpenSessionInViewFilter过滤器后数据库数据不更新的问题
- swift学习六天 项目实战-知乎日报之UITabelView使用
- android将替代ListView的RecyclerView的使用和进阶使用,替用GallRery
- 开源项目PullToRefresh详解(四)——PullToRefreshListView和ViewPager的结合使用
- Android5.0新控件RecyclerVIew的介绍和兼容使用的方法
- RecyclerView的使用
- RecyclerView初级使用
- 解决Android SwipeRefreshLayout & RecyclerView使用的Bug
- ANDROID L——RecyclerView,CardView导入和使用(Demo)
- ANDROID L——RecyclerView,CardView导入和使用(Demo)
- Android L中的RecyclerView 、CardView 、Palette的使用