个人记录之RecycleView的具体实现(简单实现)

RecycleView的设计模式是观察者模式,这个以后再深究。

recycleview有三种布局(1)瀑布流StaggeredGridLayoutManager(2)GridLayoutManager(3)Layoutmanager.他们 都有横纵滑动的功能

具体实现:

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

    initData();
    mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayout.VERTICAL);//设置横纵显示
    mRecyclerView.setLayoutManager(linearLayoutManager);
    mRecyclerView.setAdapter(mAdapter = new HomeAdapter());
    mRecyclerView.addItemDecoration(new MyDecorlation(MainActivity.this, MyDecorlation.VERTICAL_LIST));
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
}

HomeAdapter要继承RecycleView.Adapter, 重写oncreatViewHold(),这个方法是用来获取到布局,并设置给Viewhold的,onBindViewHold()是和viewhold进行绑定,通过holder对象获取到oncreatViewHold()布局中的控件。ViewHold类需要继承RecycleView.ViewHold,该类用于获取控件。

HomeAdapter RecyclerView.Adapter<HomeAdapter.ViewHold>{

    ViewHold (ViewGroup parentviewType) {
        View inflate = LayoutInflater.(MainActivity.).inflate(R.layout.parent)ViewHold viewHold = ViewHold(inflate)viewHold}

    (ViewHold holderposition) {
        String data = .get(position)holder..setText(data)holder..setOnClickListener(View.OnClickListener() {
            (View view) {
                Log.(+).remove()notifyItemRemoved()notifyDataSetChanged()}
        })}

    () {
        .size()}

    ViewHold RecyclerView.ViewHolder {
        TextView (View itemView) {
            (itemView)= (TextView) itemView.findViewById(R.id.)}
    }

}

布局中只有一个textview。

其中动画效果用它默认的效果,分割线需要继承RecycleView.ItemDecoration,并且要重写onDraw()和getitemoffset()方法,横向滑动和纵滑动时,设置分割线有所差别。前一个通过drawable.draw()方法去设置图片显示的具体大小和位置drawable.setBonds();后一个方法是去设置分割线相对于item的显示位置和高度。

MyDecorlation RecyclerView.ItemDecoration{

    = LinearLayoutManager.= LinearLayoutManager.[] = []{
            android.R.attr.}Drawable (Context contextorientation){
        TypedArray a = context.obtainStyledAttributes()= a.getDrawable()a.recycle()setItemdecor(orientation)}

    (orientation) {
        (orientation != && orientation != ) {
            IllegalArgumentException()}
        = orientation}

    (Canvas cRecyclerView parentRecyclerView.State state) {
        .onDraw(cparentstate)(== LinearLayoutManager.){
            setHorizontal(cparent)}{
            setVertical(cparent)}
    }

    (Canvas cRecyclerView parent) {
        left = parent.getPaddingLeft()right = parent.getWidth() - parent.getPaddingRight()childCount = parent.getChildCount()(i = i < childCounti++) {
            View child = parent.getChildAt(i)android.support.v7.widget.RecyclerView v = android.support.v7.widget.RecyclerView(parent.getContext())RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams()top = child.getBottom() + params.bottom = top + .getIntrinsicHeight().setBounds(lefttoprightbottom).draw(c)}
    }

    (Canvas cRecyclerView parent) {
        top = parent.getPaddingTop()bottom = parent.getHeight() - parent.getPaddingBottom()childCount = parent.getChildCount()(i = i < childCounti++) {
            View child = parent.getChildAt(i)RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams()left = child.getRight() + params.right = left + .getIntrinsicHeight().setBounds(lefttoprightbottom).draw(c)}
    }

    (Rect outRectView viewRecyclerView parentRecyclerView.State state) {
        .getItemOffsets(outRectviewparentstate)(== LinearLayoutManager.){
            outRect.set(.getIntrinsicHeight())}{
            outRect.set(.getIntrinsicHeight())}
    }
}

在使用RecycleView的删除和添加item时,使用的是notifyItemInserted(position);和notifyItemRemoved(position)。但是我在使用时,会出现数组越界的问题。原因是adapter并未真正的重新刷新,比如当我点击删除第二个item也就是position为1,然后再点击第二个item,就会看到跳到下一个item去了,其实这时候position为2了。所以解决方法是是在调用notifyItemInserted或notifyItemRemoved后再调用一次notifidatasetchange()。

时间: 2024-10-19 06:28:02

个人记录之RecycleView的具体实现(简单实现)的相关文章

记录一下在SpringBoot中实现简单的登录认证

代码参考博客: https://blog.csdn.net/weixin_37891479/article/details/79527641 在做学校的课设的时候,发现了安全的问题,就不怀好意的用户有可能跳过登录直接访问系统的界面和使用里面的功能,于是想为系统加个安全验证.现在常用的安全框架我知道的就是Shiro还有SpringSecurity,但这次我不打算用框架,采用拦截器filter和session技术实现了一个基于session的登录认证. 先简单地说一下原理: session和cook

记录工作用到的一个简单js脚本

测试极光发送通知接口及客户端处理情况,需在极光后台增加通知数据.由于需要多个输入框输入数据,浏览器关闭后又需重新输入数据,故作此简单js脚本,在浏览器开发者模式下执行,便自动向浏览器输入框输入数据. document.getElementsByTagName("textarea")[0].value="专家说文章测试切入横幅跳转测试切入横幅跳转" document.getElementsByClassName("input-global-blue-shad

【经历】苹果企业账号申请记录,比想象中要简单

经过十天左右,成功完成苹果的企业账号的申请,比想象中的要快些,但从流程上来看,其实可以更快的.第一次嘛,原谅自己吧,哈哈. 申请前需要确认的事情: Before applying, please ensure the following: 1.你公司计划发布内部App(发布到AppStore的不能用企业账号) Your organization plans to create and distribute iOS apps in-house. Enroll in the iOS Develope

记录学习MVC过程,MVC简单路由(三)

1.Table列表页加载数据的时候,删除 <script src="../../Scripts/jquery-1.8.2.js"></script> <script type="text/javascript"> $(function() { $("a:contains('删除')").click(function() { return confirm("请确认是否真的删除此数据?"); }

HeaderRecycleAdapter--通用的带头部RecycleView.Adapter

目录 概述 HeaderRecycleViewAdapter这是一个通用的RecycleView.Adapter,可以不需要继承即可简单的使用.此Adapter实现了带头部的处理显示,不需要使用头部显示时可以使用其简单版本SimpleRecycleViewAdapter. 适用范围 任何类型的数据 支持LinearLayoutManager及GridLayoutManager 支持竖直方向及横向方向 暂时不支持reverseLayout,即反方向布局 其它 对于文中提到一些不太能马上理解的点,后

[转]错误记录

题目:简单错误记录 题目描述: 开发一个简单的错误记录功能模块,能够记录出错的代码所在的文件名称和行号. 处理: 1.记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条错误,错误计数增加: 2.超过16个字符的文件名称,只记录文件的最后有效16个字符: 3.输入的文件可能带路径,记录文件名称不能带路径 输入描述: 一行或多行字符串.每行包括带路径文件名称,行号,以空格隔开. 文件路径为windows格式 如:E:\V1R2\product\fpgadrive.

DNS记录类型介绍(A记录、MX记录、NS记录等)

DNS A记录 NS记录 MX记录 CNAME记录 TXT记录 TTL值 PTR值 建站名词解释:DNS A记录 NS记录 MX记录 CNAME记录 TXT记录 TTL值 PTR值 泛域名 泛解析 域名绑定 域名转向 1.DNS:Domain Name System 域名管理系统 域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个惟一的IP地址,这一命名的方法或这样管理域名的系统叫做域名管理系统.  DNS:Domain Name Server 域名服务器 域名虽然便于人们记忆,但网络中

【ASP.NET基础】简单企业产品展示网站--产品编辑CIUD

摘要:本文记录创建一个小的.简单的产品网站的步骤. 一,搭建一个简单的产品展示网站,熟悉以下知识点:NVelocity模板引擎.Ajax无刷新页面请求,文件上传,Row_Number实现分页,ckEditor使用,Bootstrap的简单使用.[点击查看网站效果] 二,网站基本框架:新建项目ProductWeb ,并完成基本框架的搭建(SQLHelper,ckEditor,Common_Nvelocity,Bootstrap等添加到项目中).并创建ProductWebDB .[下载基本模板框架]

【转】nodejs+express+mongodb简单的例子

简单的介绍下node+express+mongodb这三个东西.node:是运行在服务器端的程序语言,表面上看过去就是javascript一样的东西,但是呢,确实就是服务器语言,个人觉得在一定层次上比c灵活,java就不提了.反正你只要认为node可以干很多事就行了,绝对不只是web开发.express:这货呢,就是node的一种框架,node有很多的开源框架,express是一个大神开发的(这尊神已经移驾到go语言的开发去了).express可以让你更方便的操作node(因为原生的node写起