- RecyclerView的基本介绍 :
RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓. ,先来说说RecyclerView的优点就是,他可以通过设置LayoutManager来快速实现listview、gridview、瀑布流的效果,而且还可以设置横向和纵向显示,添加动画效果也非常简单(自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果),也是官方推荐使用的.以下是官方的说明:
- RecyclerView的使用步骤 :
- 添加依赖(注意版本)
implementation 'com.android.support:recyclerview-v7:27.1.1'- 创建布局(宽高必须充满)
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>- 找控件
- 设置布局管理器
LinearLayoutManager 线性布局
GridLayoutManager 网格布局
StaggeredGridLayoutManager 瀑布流布局
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this );
//设置布局管理器
recyclerView.setLayoutManager(layoutManager);
//设置为垂直布局,这也是默认的
layoutManager.setOrientation(OrientationHelper. VERTICAL);
//设置Adapter
recyclerView.setAdapter( recycleAdapter);
//设置分隔线
recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));
//设置增加或删除条目的动画
recyclerView.setItemAnimator( new DefaultItemAnimator());
- 获取数据 (切换子线程方法)
- 创建适配器 (重写3个方法,通过接口回调实现点击事件)
//重写3个方法
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == VIEW_TYPE_ONE) {
View view = inflater.inflate(R.layout.banner_rv, null);
return new ViewHolder1(view);
} else {
View view = inflater.inflate(R.layout.article_rv, null);
return new ViewHolder2(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
int itemViewType = holder.getItemViewType();
if (itemViewType == VIEW_TYPE_ONE) {
ArrayList<String> imgs = new ArrayList<>();
for (int i = 0; i < bannerList.size(); i++) {
imgs.add(bannerList.get(i).getImagePath());
}
ViewHolder1 holder1 = (ViewHolder1) holder;
holder1.banner_rv
.setImages(imgs)
.setImageLoader(new ImageLoader() {
@Override
public void displayImage(Context context, Object path, ImageView imageView) {
Glide
.with(context)
.load(path)
.into(imageView);
}
})
.start();
} else {
ViewHolder2 holder2 = (ViewHolder2) holder;
holder2.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemCliskListen != null) {
onItemCliskListen.setonItemClisckListen(position-1);
}
}
});
holder2.tv_BFragment.setText(articleList.get(position - 1).getTitle());
}
}
@Override
public int getItemCount() {
return articleList.size() + 1;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return VIEW_TYPE_ONE;
} else {
return VIEW_TYPE_TWO;
}
}
class ViewHolder1 extends RecyclerView.ViewHolder {
public Banner banner_rv;
public ViewHolder1(View rootView) {
super(rootView);
this.banner_rv = (Banner) rootView.findViewById(R.id.banner_rv);
}
}
class ViewHolder2 extends RecyclerView.ViewHolder {
public ImageView iv_img;
public TextView tv_BFragment;
public ViewHolder2(View rootView) {
super(rootView);
this.iv_img = (ImageView) rootView.findViewById(R.id.iv_img);
this.tv_BFragment = (TextView) rootView.findViewById(R.id.tv_BFragment);
}
}
//通过接口回调实现点击事件
//1. 定义内部类
public interface onItemCliskListen{
void setonItemClisckListen(int position);
}
//2. 提出该接口对应类型的变量
private onItemCliskListen onItemCliskListen;
//并设置set方法
public void setOnItemCliskListen(RvAdapter.onItemCliskListen onItemCliskListen) {
this.onItemCliskListen = onItemCliskListen;
}
//3. 在onBindViewHolder中使用Holder 设置点击事件
holder2.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//变量调用自己的方法把position传出去
if (onItemCliskListen != null) {
onItemCliskListen.setonItemClisckListen(position-1);
}
}
});
4. 在Activity中使用Adapter调用他的内部类的set方法即可
rvAdapter.setOnItemCliskListen(new RvAdapter.onItemCliskListen() {
@Override
public void setonItemClisckListen(int position) {
//跳转到网网址
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(articleList.get(position).getLink())));
}
});
- 设置适配器
- RecyclerView 滑动监听 (加载更多数据)
mRecyclerView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//scrollState 有三种类型
//1. SCROLL_STATE_IDLE 手指未触摸屏幕,且屏幕静止
//2.SCROLL_STATE_TOUCH_SCROLL 手指未离开屏幕滑动
//3.SCROLL_STATE_FLING 手指使劲滑动屏幕,然后手指离开屏幕,屏幕仍在滚动
switch (scrollState){
case SCROLL_STATE_IDLE:
if (mIsBottom){
addMore();
mIsBottom = false;
}
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //Log.d(TAG,"firstVisibleItem:"+firstVisibleItem+",visibleItemCount:"+visibleItemCount+",totalItemCount:"+totalItemCount);
//firstVisibleItem,可见的第一个条目下标
//visibleItemCount ,可见条目数量
//totalItemCount 条目总个数
if (firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount>0){
mIsBottom = true;
}else{
mIsBottom = false;
}
}
});
}
多布局
-
RecyclerView多布局一:list+banner
① RecyclerView基本使用
②定义类型常量
③重写方法getItemViewType()根据位置返回不同类型
④重写oncreateViewHolder()根据不同类型加载不同的布局
⑤重写onBindViewHolder()根据不用类型加载不同数据注意
①获取条目总数:list.size()+1
②onBindViewHolder:获取别表条目数据的时候,position-1 -
RecyclerView多布局二:奇数位置左图右文字+偶数位置左文字右图片
① RecyclerView基本使用(看6)
②定义类型常量
③重写方法getItemViewType()根据位置返回不同类型
④重写oncreateViewHolder()根据不同类型加载不同的布局
⑤重写onBindViewHolder()根据不用类型加载不同数据 -
RecyclerView添加刷新
①添加依赖
②在布局中添加刷新的控件并找控件
③给刷新控件添加加载更多、下拉刷细腻添加监听,监听中写具 体代码
④刷新完毕列表,关闭SmartRefreshLayout头和脚。
网友评论