recycle的加载更多以及网格和列表布局的随意切换
来源:互联网 发布:win32编程视频教程 编辑:程序博客网 时间:2024/05/17 07:13
第一篇文章:写博客都是为了记录一些安卓开发过程中遇到的常见问题解决和功能实现。 废话不多说切入正题。我们都知道谷歌官方没有提供给我们加载更多的功能框架,recycleview在开发过程中应用频繁。它可以实现各种布局,如listview列表和gridview的表格还有轮播器,以及丰富多彩的瀑布流。这篇文章讲述如何自己完成一个加载更多功能。控件recycleview,适配器recycleview.adapter。
适配器代码如下: 由于这块涉及到两种item,所以我写了两个viewholder,所以直接recycleview.adapter后的泛型写成recycleview.viewHolder,让两种item对应的viewholder进行继承。 首先将如何实现加载更多,我们的思路是把列表的item分为两种类型(也就是加载两种布局),这个可以在getItemViewType中实现;
//加载更多
//此方法在activity里调用控制加载更多item的显示和隐藏
public SellerRecyclerAdapter setShowLoadMore(boolean showLoadMore){
isShowLoadMore = showLoadMore;
return this;
}
//得到加载更多布局的数量1或者0
private int getFooterItemCount() {
return isShowLoadMore ? 1: 0;
}
//条目类型的切换
@Override public int getItemViewType(int position) {
//当加载更多为true并且位置在另一种item数量的最后一个位置加1处显示
if (isShowLoadMore && position + 1 == getItemCount()) {
return TYPE_FOOTER;
}
else {
return TYPE_ITEM;
} }
public class SellerRecyclerAdapter extends RecyclerView.Adapter <RecyclerView.ViewHolder>{
List<Map<String, String>> mData;
private Context context;
private int type;
SellerViewHolder sellerViewHolder;
private static final int TYPE_ITEM = 0;
private static final int TYPE_FOOTER = 1;
private boolean isShowLoadMore = false;
public SellerRecyclerAdapter(List<Map<String, String>> mData, Context context,int type ) {
this.mData = mData;
this.context = context;
this.type=type; }
//加载更多
public SellerRecyclerAdapter setShowLoadMore(boolean showLoadMore) {
isShowLoadMore = showLoadMore;
return this; }
private int getFooterItemCount() {
return isShowLoadMore ? 1: 0;
} /
/条目类型
@Override public int getItemViewType(int position) {
if (isShowLoadMore && position + 1 == getItemCount()) {
return TYPE_FOOTER;
}else {
return TYPE_ITEM;
}
}
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){ case TYPE_ITEM://正常类型
if (type==1){
return sellerViewHolder= new SellerViewHolder(LayoutInflater.from(context) .inflate(R.layout.list_product, parent, false));//线性
}else if (type==2){
return sellerViewHolder= new SellerViewHolder(LayoutInflater.from(context) .inflate(R.layout.item_new_goods, parent, false));
} case TYPE_FOOTER:
//显示加载更多
return new FootViewHolder(LayoutInflater.from(context) .inflate(R.layout.load_more, parent, false));
} return null;
}
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
if (holder instanceof SellerViewHolder) {
//此处可以得要用的Viewholder对控件赋值
sellerViewHolder = (SellerViewHolder) holder;
}}
@Override public int getItemCount() {
return mData.size();
}
class SellerViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.imgPhoto) ImageView image;
@BindView(R.id.txtTitle) TextView txtTitle;
private TextView txtCity; ImageView ivMix,tvFavour1,tvFavour2,tvFavour3; LinearLayout layFavourList; RelativeLayout relativeLayout; public SellerViewHolder(View itemView) { super(itemView); ButterKnife.bind(this,itemView); } /** *加载更多的布局 第二种布局 */ private static class FootViewHolder extends RecyclerView.ViewHolder { FootViewHolder(View view) { super(view); } }}
/*接下来是activity中的调用*/还有一个重要的我自己写的recycleview的滑动监听类/* *
recycleView的滑动监听事件
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
public abstract class RecyclerViewScrollListener extends RecyclerView.OnScrollListener {
protected int autoLoadLineCount = 1;
public RecyclerViewScrollListener() {
}
public RecyclerViewScrollListener(int autoLoadLineCount) {
this.autoLoadLineCount = autoLoadLineCount;
}
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int spanCount = 1;
RecyclerView.LayoutManager mLayoutManager = recyclerView.getLayoutManager();
if (mLayoutManager instanceof GridLayoutManager) {
spanCount = ((GridLayoutManager) mLayoutManager).getSpanCount();
} i
int endPosition = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();
int totalCount = recyclerView.getAdapter().getItemCount();
int lastLineCount = totalCount % spanCount;
int minNeedLoadMorePosition = totalCount - 1 - autoLoadLineCount * spanCount;
if (lastLineCount != 0) {
minNeedLoadMorePosition += spanCount - lastLineCount;
}
if (endPosition >= minNeedLoadMorePosition) {
onLoadMore();
}
} public abstract void onLoadMore();
});}
/*接下来是activity中的调用*/首先是实例化监听类:再第一次请求结束后根据相应的条件判断是否有更多数据:
sellerProductAdapter.notifyDataSetChanged();
sellerProductAdapter.setShowLoadMore(false);//移除加载更多
recyclerView.removeOnScrollListener(recyclerViewScrollListener);
//判断是否有更多
if (listProduct.size()<iAllRecordNum){
//显示加载更多布局
sellerProductAdapter.setShowLoadMore(true);
isLoadMore=true;
//上滑监听再加载更多 添加滑动监听
recyclerView.addOnScrollListener(recyclerViewScrollListener);
}else {
//显示布局没有更多了
noMore.setVisibility(View.VISIBLE);
sellerProductAdapter.setShowLoadMore(false);
isLoadMore=false; } } }
: 这个如果网速过快或者滑动速度快了加载更多的布局会一闪而过:我为了实现效果再下次刷新请求的时候利用handler让时间停留了几秒 //滑动监听判断一下isLoadMore的值 这个滑动监听有待优化
private void loadMore() {
if (isLoadMore){
//主线程 android.os.Handler handler=new android.os.Handler();
Thread thread=new Thread(new Runnable() {
@Override public void run() {
DoSearchAction(false);
}
});
handler.postDelayed(thread, 2000); } }。
ok这样就可以实现了。
- recycle的加载更多以及网格和列表布局的随意切换
- RecyclerView下拉刷新、上拉加载更多以及复杂列表布局的实现
- recycleview线性布局和网格布局的切换
- RecyclerView线性布局和网格布局的切换
- Android recyclerView网格布局上拉加载更多视图的设计
- 【iOS干货】:列表和网格视图的相互切换
- Toolbar+RecyclerView进阶使用(仿淘宝列表、网格布局之间的切换)
- recycle的切换list和grid,数据库的一些操作
- RecyclerView切换布局(列表→网格)
- 网格布局管理器gridbagconstraints 的设置随意宽度实例(四)
- 为Recycle添加头尾布局的BaseAdapter
- 商城项目实战 | 8.2 SwipeRefreshLayout 实现可以下拉刷新和加载更多的热门商品列表
- 列表页点击加载更多,无刷新加载更多文章的方法(yii)
- Android中利用ListView和GridView实现列表视图和网格(图标)视图的相互切换显示
- Weex实现GridView的网格布局以及浮层效果
- Jqeury Mobile实战之切屏效果以及屏幕滚动到底端加载更多和点击切换更多
- 手机端的 上拉加载列表更多(Java)
- Android ListView列表 刷新和加载更多
- adb 自动脚本
- MySql 设置外网访问
- HDU 6073 Matching In Multiplication(强连通+拓扑)
- QT学习篇(三)总结界面设计相关类
- IO操作时,系统为什么不会将字符与汉字搞错
- recycle的加载更多以及网格和列表布局的随意切换
- 无监督︱异常、离群点检测 一分类——OneClassSVM
- 【mongoDB】mongoDB三秒入门笔记
- [LeetCode]647. Palindromic Substrings
- hpu暑假训练A
- 编写程序,打印出9×9乘法表
- Busybox1.27.1make menuconfig配置界面
- SQL的Join语法
- 指针小聊