RecyclerView

前言

最近使用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的简单使用和置顶悬浮有机会再见拜拜。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值