前言
最近使用RecyclerView完成功能,也是查找了很多资料。收获就是知道了RecyclerView真的很强大。嵌套的RecyclerView使用效果并没有达到预期。后来使用了RecyclerView.ItemDecoration来完成了初步的效果。
以下是本篇文章正文内容,下面案例仅供参考
一、RecyclerView
首先要明白RecyclerView用来做什么比如:多条数据滑动(横向,纵向),瀑布流,可以动态的去添加item(这里其实相当于一个页面,简单的控件)。当后台数据传过来时调用创建即可动态生成滑动列表。
二、使用步骤
1.引入库
代码如下(示例):
implementation 'com.android.support:recyclerview-v7:29.0.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
2.
代码如下(示例):
创建一个对象这里是通过后台数据去创建一个Item对象,数据保存在这个类的对象中
public class ItemVO {
private int mImg;
private String mName;
private int mImg2;
private String groupName;
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public ItemVO(int mImg, String mName) {
this.mImg = mImg;
this.mName = mName;
}
public ItemVO(String groupName,int mImg) {
this.groupName = groupName;
this.mImg = mImg;
}
public int getmImg2() {
return mImg2;
}
public void setmImg2(int mImg2) {
this.mImg2 = mImg2;
}
public void setmImg(int mImg) {
this.mImg = mImg;
}
public void setmName(String mName) {
this.mName = mName;
}
public int getmImg() {
return mImg;
}
public String getmName() {
return mName;
}
}
try {
ArrayList<ItemVO> mList1=new ArrayList<ItemVO>();
//调用函数去添加
addData();
private LinearLayoutManager manager2 = new LinearLayoutManager(getContext());
MyAdapter myAdapter = new MyAdapter(mList1,getContext());
public static RecyclerView mView2.setLayoutManager(manager2);
mView2.addItemDecoration(new StickHeaderDecoration(getActivity()));
mView2.setAdapter(myAdapter);
//这里是控制滑动方向及确定滑动的位置
add(myAdapter,mView2);
LinearLayoutManager llm1 = (LinearLayoutManager) mView2.getLayoutManager();
llm1.scrollToPositionWithOffset(0, 0);
myAdapter.notifyItemChanged(0);
}catch (Exception e){
}
private void addData() {
for (int i = 0 ; i<=15 ; i= i+1){
ItemVO itemVO = new ItemVO("Home"+i,R.drawable.log);
//添加到数组
mList1.add(itemVO);
itemVO = null;
}
}
这里用来处理添加多个item后的事件
package com.example.myapplication2.util;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.example.myapplication2.R;
import com.example.myapplication2.SmartHeating;
import com.example.myapplication2.entity.ItemVO;
import java.util.List;
/**
* Created by Dell on 2017/1/9.
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
//动态数组
private List<ItemVO> mList;
//构造
public MyAdapter(List<ItemVO> mList) {
this.mList = mList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//绑定行布局
View view = View.inflate(parent.getContext(), R.layout.item,null);
//实例化ViewHolder
ViewHolder holder = new ViewHolder(view);
return holder;
}
//设置数据
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//获取当前实体类对象
ItemVO vo = mList.get(position);
//设置
if ("°C".equals(SmartHeating.Temperatur)){
holder.text.setText(vo.getmName()+ SmartHeating.Temperatur);
}
if ("°F".equals(SmartHeating.Temperatur)){
Double F=Double.parseDouble(vo.getmName())*1.8+32;
holder.text.setText(String.format("%.1f", F)+ SmartHeating.Temperatur);
}
// holder.img.setImageResource(vo.getmImg());
}
//数量
@Override
public int getItemCount() {
return mList.size();
}
//内部类
class ViewHolder extends RecyclerView.ViewHolder{
//行布局中的控件
// ImageView img;
TextView text;
public ViewHolder(View itemView) {
super(itemView);
//绑定控件
// img = (ImageView) itemView.findViewById(R.id.item_img);
text = (TextView) itemView.findViewById(R.id.textView);
}
}
}
这里是item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="75dp"
android:layout_height="wrap_content"
android:background="#FF0000"
android:orientation="horizontal"
android:padding="10dp">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:text="TextView"
android:textColor="#FFFFFF" />
</LinearLayout>
然后就是添加控制滑动的功能判断当前滑动的位置。这里就可以通过代码去完成控制滑动的位置方向
public void add(final RecyclerView.Adapter myAdapter, final RecyclerView mView){
mView.setOnScrollListener(new RecyclerView.OnScrollListener() {
//用来标记是否正在向最后一个滑动
boolean isSlidingToLast = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
// 当不滚动时
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//获取最后一个完全显示的ItemPosition
//此方法常用作判断是否能下拉刷新,来解决滑动冲突
int findFirstCompletelyVisibleItemPosition = ((LinearLayoutManager)manager).findFirstCompletelyVisibleItemPosition();
//最后一个完整的可见的item位置
int findLastCompletelyVisibleItemPosition = ((LinearLayoutManager)manager).findLastCompletelyVisibleItemPosition();
//最后一个可见的位置
int findLastVisibleItemPosition = ((LinearLayoutManager)manager).findLastVisibleItemPosition();
int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
int totalItemCount = manager.getItemCount();
// 判断是否滚动到底部,并且是向右滚动
LinearLayoutManager llm = (LinearLayoutManager) mView.getLayoutManager();
if (! isSlidingToLast){
llm.scrollToPositionWithOffset(findLastVisibleItemPosition-1, 0);
myAdapter.notifyItemChanged(findLastVisibleItemPosition-1);
}else {
llm.scrollToPositionWithOffset(findLastVisibleItemPosition, 0);
myAdapter.notifyItemChanged(findLastVisibleItemPosition);
}
if (lastVisibleItem == (totalItemCount - 1) && isSlidingToLast) {
//加载更多功能的代码
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//dx用来判断横向滑动方向,dy用来判断纵向滑动方向
if (dx > 0) {
//大于0表示正在向右滚动
isSlidingToLast = true;
} else {
//小于等于0表示停止或向左滚动
isSlidingToLast = false;
}
}
});
}
这里基本上RecyclerView的滑动功能和他的基本使用以及完成了后续。如果需要RecyclerView嵌套使用网上有三种解决方案,阻止父RecyclerView拦截。后来我尝试了一下。需要对子RecyclerView限定他的范围我觉得并不怎么好用。ItemDecoration的简单使用和置顶悬浮有机会再见拜拜。