RecycleView

RecycleView嵌套RecycleView列表垂直滑动冲突 项目需求 主活动视图上拉显示子活动视图列表,子活动视图列表可以上下滑动,下拉可以显示主活动视图列表。看正确效果图 遇到的问题 开发过程中首先要考虑这样的一个实现效果用什么实现?浮现在大脑里的首先是viewpager,自己也尝试着去实现,发现自定义viewpager垂直滑动并不友好,最后放弃了。于是开始了第二套方案,尝试一下google刚刚推出不久的viewpager2,viewpa... 阅读详情


MainActivity中:

package com.bwei.demo.day13_recycview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private List<String> list;
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView rcv = findViewById(R.id.rcv);

        //设置布局管理器

        /**
         * 第一个参数是一个上下文
         * 第二个参数是方向
         * 第三个参数是否返转
         *
         *
         * 第一种是   线性布局
         * 第二种是   表格布局、
         * 第三种是    瀑布流的
         */
        rcv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));

        //设置item添加和删除的动画
        rcv.setItemAnimator(new DefaultItemAnimator());
        //增加分隔线
        rcv.addItemDecoration(new MyDividerItemDecoration(this,LinearLayoutManager.VERTICAL));


        //第一个参数的话是上下文
        //第二个参数是一行有几个
       // rcv.setLayoutManager(new GridLayoutManager(this,4));

       // rcv.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));

        ititData();

        adapter = new MyAdapter(list);
        rcv.setAdapter(adapter);


        //MainActivity 回调adapter方法
        adapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {

            @Override
            public void itemClick(View v, int position) {
                Toast.makeText(MainActivity.this, "item点击事件", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void itemLongClick(View v, int position) {
                Toast.makeText(MainActivity.this, "item点击长按事件", Toast.LENGTH_SHORT).show();
            }
        });

    }

    private void ititData() {
        list = new ArrayList<>();
        for (int x=0;x<10;x++){
            list.add("item"+x);
        }
    }

    /**
     * 添加item的点击事件
     * @param view
     */
    public void addItem(View view) {
        adapter.add();
    }

    /**
     * 添加item的点击事件
     * @param view
     */
    public void remvoeItem(View view) {
        adapter.remove();
    }
}

适配器中的:

package com.bwei.demo.day13_recycview;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import java.util.List;

/**
 * Created by Administrator on 2018/3/15.
 */

public class MyAdapter extends RecyclerView.Adapter {
    List<String> list;
    OnItemClickListener listener;

    public MyAdapter(List<String> list) {
        this.list = list;
    }

    /**
     * 创建ViewHolder
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = View.inflate(parent.getContext(), R.layout.rc_item, null);


        //创建ViewHolder  把view通过构造方法传过去
        MyViewHolder myViewHolder = new MyViewHolder(view);


        return myViewHolder;
    }


    /**
     * 绑定view   简单的可以认为是给item设置数据用的
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        final MyViewHolder myViewHolder = (MyViewHolder) holder;

        myViewHolder.mtv.setText(list.get(position));
        myViewHolder.bt.setText("aaaa");

        //给recycleView的item设置点击事件
        myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //索引
                int layoutPosition = myViewHolder.getLayoutPosition();

                //进行回调
                listener.itemClick(myViewHolder.itemView,layoutPosition);
            }
        });

        //长按事件
        myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {

                //索引
                int layoutPosition = myViewHolder.getLayoutPosition();

                //进行回调
                listener.itemLongClick(myViewHolder.itemView,layoutPosition);

                return true;
            }
        });



    }

    /**
     * recyclerView  的item的个数
     * @return
     */
    @Override
    public int getItemCount() {
        return list.size();
    }


    /**
     * recyclerView的监听事件
     */
    public void setOnItemClickListener(OnItemClickListener listener){


        this.listener = listener;
    }


    class MyViewHolder extends RecyclerView.ViewHolder{

        TextView mtv;
        Button bt;

        public MyViewHolder(View view) {
            super(view);

            mtv =view.findViewById(R.id.rv_tv);
            bt = view.findViewById(R.id.rv_bt);
        }


    }


    public void add(){
       list.add(0,"我是新加的数据");


      // notifyDataSetChanged();
       notifyItemInserted(0);

    }


    //删除item的方法
    public void remove(){

        if (list==null){
            return;
        }else {
            //进行移除
            list.remove(0);
            notifyItemRemoved(0);
        }

    }


    interface OnItemClickListener{
        void  itemClick(View v,int position);
        void  itemLongClick(View v,int position);
    }
}


用于绘制:

package com.bwei.demo.day13_recycview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by Administrator on 2018/3/15.
 */

public class MyDividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{
            android.R.attr.listDivider
    };
    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
    /**
     * 用于绘制间隔样式
     */
    private Drawable mDivider;
    /**
     * 列表的方向,水平/竖直
     */
    private int mOrientation;


    public MyDividerItemDecoration(Context context, int orientation) {
        // 获取默认主题的属性
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
        setOrientation(orientation);
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        // 绘制间隔
        if (mOrientation == VERTICAL_LIST) {
            drawVertical(c, parent);
        } else {
            drawHorizontal(c, parent);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        if (mOrientation == VERTICAL_LIST) {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    }

    private void setOrientation(int orientation) {
        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
            throw new IllegalArgumentException("invalid orientation");
        }
        mOrientation = orientation;
    }

    /**
     * 绘制间隔
     */
    private void drawVertical(Canvas c, RecyclerView parent) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();
        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin +
                    Math.round(ViewCompat.getTranslationY(child));
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    /**
     * 绘制间隔
     */
    private void drawHorizontal(Canvas c, RecyclerView parent) {
        final int top = parent.getPaddingTop();
        final int bottom = parent.getHeight() - parent.getPaddingBottom();
        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int left = child.getRight() + params.rightMargin +
                    Math.round(ViewCompat.getTranslationX(child));
            final int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }
}




布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.bwei.demo.day13_recycview.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rcv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         />



    <Button
        android:onClick="addItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加"/>
    <Button
        android:onClick="remvoeItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="移除"/>

</LinearLayout>

Recycleview的item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:id="@+id/rv_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:focusable="false"
        android:id="@+id/rv_bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>


RecycleView的基本使用 前言 为了解决 ListView 存在的拓展性差、需要手动优化性能等问题,Android 提供了滚动组件 RecycleView。本篇博客用于梳理 RecycleView 的使用方法。 RecycleView 的优点 RecycleView 仅会处理当前现实在屏幕上的项。假如列表中有 1000个元素,而页面只显示其中 10 个,那么 RecycleView 仅处理这 10 个项 当某个项滚出屏幕时,RecycleView 会回收其视图。这个项被回收,用于填充新进入屏幕的内容。 当某一项发生变化时,仅重新绘 阅读详情

相关推荐

Android RecycleView出现大间隔问题分析

Android RecycleView出现大间隔问题分析文章链接知识点 RecycleView使用StaggeredGridLayoutManager出现大间隔问题; RecycleView中一些“有兴趣的方法”记录; 新名词记录{} 概述在开发中,遇到一个很奇怪的问题:当我使用瀑布流布局的时候,重新new一个adapter进去,然后就会出现第一个item和后面的item之间出现一个很大的空白区域。

姚镜堂 7520

Android TV开发总结【RecycleView】

在TV开发中RecycleView的使用是最让人头疼的经常会出现焦点丢失。因为当item未显示时不能获取焦点。所以当我们按上下键时经常丢失焦点或者焦点乱跳。要解决这个问题我们必须要手动控制RecyclerView 的按键和焦点移动。 所以我们这里需要需要自定义RecycleView。 代码如下,各个方法作用在注视中已添加: public class TvRecyclerView extend...

李彬博客专栏 2703

RecycleView 删除指定item

以前在使用ListView的时候,ListView删除item比较简单,现在基本都不再使用ListView,都换成了RecycleView了,这里的删除稍微麻烦一点,要执行多个方法,才能把item删除掉,根据代码讲解一下 adapter.notifyItemRemoved(position); adapter.notifyItemRangeChanged(0, adapter.getItem

Hedong的博客 5739

Android RecycleView嵌套RecycleView 高度不对问题

在使用RecycleView嵌套RecycleView时,可能会发生子RecycleView高度显示不对问题。 注意修改下面几处,在父Adapter的父布局 @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { LayoutInflater.from(context).inflate(R.layout.

傲慢的上校的专栏 7787

RecycleView的基本使用方法

为什么要使用RecycleView,而不再使用ListView记得每一次在用ListView的时候,在Adapter中,总是需要我们自己去创建一个ViewHolder,去存储ListItem的布局,这么做的原因在于findViewById()是一个很耗时间的操作,所以我们需要一个静态的对象将layout过的控件给保存起来,下一次刷新这个item的时候,就不再需要调用findViewById去View

持剑 5803

ScrollView嵌套RecycleView之后 recycleView惯性消失

在项目中遇到recycleView滑动非常卡顿,惯性消失,查看XML发现和scrollView嵌套了, scrollView 套了LinearLayout 然后套了N个元素,其中就有recycleView. 初步怀疑,两者冲突了,应该是move事件,经调查前辈们已经解决。 现贴出带码:自定义scrollView,然后在套用recycleView。/** * 屏蔽 滑动事件 * */cl

HKlsijun的博客 767

Android Studio在Fragment中添加Recycleview

Android Studio在Fragment中添加Recycleview 当我们在Android Studio中搭建好一个类似于微信界面的四个Fragment后,我们开始尝试先在其中的一个Fragment下新建一个Recycleview。下图是新建RecycleView之前已经搭建好的界面: 我们现在选择最左边的“新闻”Fragment,在这个片段下新建一个RecycleView: 1.我们先在这个Fragment的tab_01中新建一个RecycleView,并且更改一些参数: 2.在layout底

someone66_的博客 3605

中科蓝讯蓝牙耳机SDK实战:从目录解析到消息处理框架

本文深入解析中科蓝讯蓝牙耳机SDK的目录结构与消息处理框架,提供从硬件驱动到蓝牙功能定制的实战指南。重点剖析SDK核心模块如消息队列机制、按键事件处理及电量报告优化,并分享二次开发中的调试技巧与避坑经验,助力开发者高效完成TWS耳机功能定制。

weixin_30335575的博客 387

两个recycleview列表左右联动实现

概述: 在之前的项目中曾经做过电商分类页面左右两个列表联动的实现,当时的做法是左侧列表使用RecycleView,右侧列表使用的是ScrollView,通过onOverScrolled方法来检测右侧列表是否已经到达了顶部继续下拉还是已经到达了底部继续上滑。这种方式肃然也实现了左右两个列表联动的需求,但是体验上还是有继续优化的空间,之后做了一版优化,左右两个列表都是用recycleview来实现。 ...

搬砖的老牛 3068

scratch航天梦主题课程作品分享,包含ppt、素材包

而今年多国都将发射探测器尝试登陆月球,2023年或将称为“登月年”,请大家发挥创新思维,以“星辰大海”为创作主题,搜集相关信息 、展开联想,为实现升空 、探测 、取样贡献创意!即使去淘宝买的素材,也要从百度网盘,但素材太多大了或者太多文件,也要充值百度网盘超级会员才能保存,提高下载速度。同学们大家好,今天我们就要开始航天主题-嫦娥五号探月工程系列的编程课程了,不仅可以学习到很多航天知识,了解本次嫦娥五号的发射历程,还能让我们用编程遨游太空呢。即使下载了,也要上传,不是特别方便,尤其是不好查找。

少儿编程吕口口 2481

ESXi 6.7升级17700523补丁全流程:从下载到验证的保姆级教程

本文提供ESXi 6.7升级17700523补丁的完整流程指南,涵盖从下载、上传到验证的详细步骤。通过SSH命令和vSphere Client操作,确保系统管理员能够安全高效地完成补丁升级,提升虚拟化环境的安全性和稳定性。

linux6sysadmin的博客 839

使用BRVAH RecycleView 嵌套RecycleView点击Item里面内容无法响应

使用BRVAH RecycleView 嵌套RecycleView 点击Item 子类RecycleView内容的部分无法被点击。

Xia_燚的博客 1065

Java服务端实现Google Pay支付功能

全网最全代码、最清晰服务端处理Google Pay,最清晰讲解Google Pay集成逻辑。

jack2350536098的博客 1万+

RecycleView使用总结二

一. 摘要    RecycleView没有像ListView那样直接提供添加headerView和footerView的方法,所以要实现这样的效果需要自己去实现。本文记录了通过item类型作为区分,来为列表添加headerView的整个流程。同时,记录了针对线性布局,网格布局,瀑布流布局的适配方法。   左右滑删除,拖动Item是很常见的功能。针对这些功能,安卓API中提供了相关的辅助类Item...

潇潇暮雨的专栏 1391

MATLAB小白也能搞定!BCT脑网络分析工具箱安装与入门指南

本文为零基础用户提供了一份详尽的BCT脑网络分析工具箱安装与入门指南。从MATLAB环境配置、BCT工具箱下载与路径添加,到连接矩阵构建、节点度与聚类系数等基础指标计算,手把手带领神经科学研究者跨越编程门槛,快速掌握脑影像数据分析的核心流程。

threejs5artist的博客 1089

BVH2SMPL 实战笔记

BVH2SMPL 实战笔记

jacke121的专栏 840

RecycleView使用详解

一个非常重要和常用的UI组件,在应用中以列表形式或网格形式展示大量数据,是一个可滑动的组件。

weixin_62416090的博客 917

冠层分析法提取叶面积指数及其应用

冠层分析法是利用植物冠层空间结构分析LAI的方法。其基本原理是通过相机或扫描仪对植物冠层垂直方向的照片或图像进行获取,再运用图像处理方法实现植被的自动识别和覆盖度计算,以此推算LAI。假设有一块田地,需测量其LAI,首先在田地中央设置一杆高度为3米、朝向田地中心、覆盖角度为50度的相机。利用上述函数,对相机采集到的图像进行处理,即可得到田地的LAI。在Matlab中,读取图片可以使用imread函数,对图片进行预处理可以使用imadjust函数调整灰度,使用imbinarize函数进行二值化处理。

m0_47037246的博客 739

RecycleView嵌套RecycleView

思路:RecycleView嵌套一个RecycleView首先要确定一个rootRecycleView这个rootRecycleView是要包含多个子RecycleView,在写rootRecycleView的适配器的时候其子项就是一个recycleView,然后再onBindViewHolder方法中为子recycleView设置自己的适配器。子recycleView的适配器就跟普通的适配器一样

lzjqcc的博客 8214

从零开始学 AUTOSAR:深入浅出 SAE J1939 诊断通信管理器(J1939Dcm)深度完整版

SAE J1939 是美国汽车工程师学会制定的重型车辆 CAN 总线通信标准,覆盖卡车、客车、工程机械、农机、船舶等,是商用车领域的 “通用语言”。基于CAN 2.0B 扩展帧(29 位 ID)(车规主流)PGN(参数组号)+ SPN(可疑参数号)核心标准:J1939-21:数据链路层(CAN 帧格式、地址声明)J1939-71:应用层(普通信号、报文)诊断层(核心!J1939Dcm 依据)J1939-81:网络管理(地址管理、节点检测)

getusushu的博客 114

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RecycleView的实现

RecycleView的实现步骤

天高任鹏飞 1125

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Kotlin实现recycleview

导入依赖: implementation "androidx.recyclerview:recyclerview:1.1.0" implementation "androidx.cardview:cardview:1.0.0" activity: package com.example.zkotlin import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.rec

cf8833的博客 2872

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RecycleView用法总结

先上效果图: 简介: 如动画所示,这个项目下来用上了ListView,GridView,还有一个横向的GridView。不过,却没有单独用我们所熟知的ListView等多个控件,而仅仅只用了一个RecycleView。顾名思义,RecycleView——可以循环♻️回收,反复使用的View,一个顶三。从此listView可以有替代者了。 怎么用: (1)准备 在XML文件

君子务本 2086

RecycleView 简单用法

RecycleView 的出现逐渐取代了 ListView GridView  功能更加强大 省去了ListView的优化问题 更方便使用:首先导入依赖:(依赖的版本号 根据个人需要进行修改)compile 'com.android.support:recyclerview-v7:27.+'xml文件:(一个简单的控件 v7包)&lt;android.support.v7.widget.Recyc...

做事不嫌早晚,重要的是在路上. 3635

RecycleView+Glide

RecycleView+Glide 封装类 public class Utils { public static boolean isMobileNO(String mobileNums) { /** * 判断字符串是否符合手机号码格式 * 移动号段: 134,135,136,137,138,139,147,150,151,152,157...

weixin_44310357的博客 488

RecycleView 屏蔽item中嵌套的RecycleView的点击事件

RecycleView嵌套RecycleView,外层的是RecycleView1,内侧的是RecycleView2,RecycleView1是垂直的列表,RecycleView2是网格布局,直接是itemView ImaegView.现在想要屏蔽ImageView的点击事件。也就是将点击事件交给RecycleView1的ItemView。 两种方法: 1:在RecycleView1的Item...

androidzmm的博客 5115
上一篇: OkHttp工具类
下一篇: Glide的使用
Melect
博客等级 码龄9年 10粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值