【移动应用开发技术】RecyclerView怎么在Android中使用_第1页
【移动应用开发技术】RecyclerView怎么在Android中使用_第2页
【移动应用开发技术】RecyclerView怎么在Android中使用_第3页
【移动应用开发技术】RecyclerView怎么在Android中使用_第4页
【移动应用开发技术】RecyclerView怎么在Android中使用_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】RecyclerView怎么在Android中使用

RecyclerView怎么在Android中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先ListView与RecyclerView两者非常相似,两者提供view都是依赖适配器。只不过就是5.0版本推出RecyclerView后,Google将adapter和viewHolder做了一系列的优化和封装。不像之前为了复用Listview里面的converView,要类似在getView里面实现下列的代码:上面代码看起来挺眼熟吧~二、对比RecyclerView,google进行的优化在RecyclerView依赖的适配器中,无论是适配器还是ViewHolder,从源码我们可以看出,都存在RecyclerView的匿名内部类。相对于Listview,RecyclerView内置了多级缓存、RecyclerViewPool(从线程的角度,可以理解成类似线程池的东西,即多个RecyclerView可以公用一个view)、ViewHolder(已经实现了复用,相对于Listview的BaseAdapter中getView方法需要开发者自己引入复用问题方便很多)等等。这里我们简单说下两个方法:public

ViewHolder

onCreateViewHolder(ViewGroup

parent,

int

viewType)public

void

onBindViewHolder(ViewHolder

holder,

int

position)在以前的BaseAdapter中,所有视图加载、数据绑定以及复用,都需要我们直接在getView里面进行操作。onCreateViewHolder负责视图加载并且内部完成复用,onBindViewHolder负责数据绑定并且内部完成一系列的缓存机制。这里满足了视图层与逻辑层的分离,典型的mvp模式。三、RecyclerView的头部与尾部实现RecyclerView不像ListView拥有addHeaderView()与addFooterView()的方法简单添加头部尾部即可,而且RecyclerView也没有像ListView的列表点击监听方法(setItemOnclickListener),这里我也不明白为什么官方会取消了这些独有的属性,不过我们依然可以在onBindViewHolder方法中进行事件绑定!具体头部与尾部实现方法,这里有个诀窍,这里先看一个方法:public

int

getItemViewType(int

position)getItemViewType方法是在执行onCreateViewHolder(ViewGroupparent,intviewType)前回调用viewType,目的是为了根据viewType不同创建不同的视图。我们可以通过在onCreateViewHolder创建视图的时候,对viewType进行判断,如果添加了头部,在position=0的时候回调头部的viewType给onCreateViewHolder,从而创建头部。尾部创建方法于此类同,直接看下代码,适配器的实现:package

cn.wsy.recyclerdemo;

import

android.content.Context;

import

android.support.v7.widget.GridLayoutManager;

import

android.support.v7.widget.RecyclerView;

import

android.view.LayoutInflater;

import

android.view.View;

import

android.view.ViewGroup;

import

android.widget.TextView;

import

java.util.ArrayList;

import

java.util.List;

/**

*

Created

by

wsy

on

2016/8/4.

*/

public

class

MyAdapter

extends

RecyclerView.Adapter<MyAdapter.MyHolder>

{

private

RecyclerView

mRecyclerView;

private

List<String>

data

=

new

ArrayList<>();

private

Context

mContext;

private

View

VIEW_FOOTER;

private

View

VIEW_HEADER;

//Type

private

int

TYPE_NORMAL

=

1000;

private

int

TYPE_HEADER

=

1001;

private

int

TYPE_FOOTER

=

1002;

public

MyAdapter(List<String>

data,

Context

mContext)

{

this.data

=

data;

this.mContext

=

mContext;

}

@Override

public

MyAdapter.MyHolder

onCreateViewHolder(ViewGroup

parent,

int

viewType)

{

if

(viewType

==

TYPE_FOOTER)

{

return

new

MyHolder(VIEW_FOOTER);

}

else

if

(viewType

==

TYPE_HEADER)

{

return

new

MyHolder(VIEW_HEADER);

}

else

{

return

new

MyHolder(getLayout(R.layout.item_list_layout));

}

}

@Override

public

void

onBindViewHolder(MyHolder

holder,

int

position)

{

if

(!isHeaderView(position)

&&

!isFooterView(position))

{

if

(haveHeaderView())

position--;

TextView

content

=

(TextView)

holder.itemView.findViewById(R.id.item_content);

TextView

time

=

(TextView)

holder.itemView.findViewById(R.id.item_time);

content.setText(data.get(position));

time.setText("2016-1-1");

}

}

@Override

public

int

getItemCount()

{

int

count

=

(data

==

null

?

0

:

data.size());

if

(VIEW_FOOTER

!=

null)

{

count++;

}

if

(VIEW_HEADER

!=

null)

{

count++;

}

return

count;

}

@Override

public

int

getItemViewType(int

position)

{

if

(isHeaderView(position))

{

return

TYPE_HEADER;

}

else

if

(isFooterView(position))

{

return

TYPE_FOOTER;

}

else

{

return

TYPE_NORMAL;

}

}

@Override

public

void

onAttachedToRecyclerView(RecyclerView

recyclerView)

{

try

{

if

(mRecyclerView

==

null

&&

mRecyclerView

!=

recyclerView)

{

mRecyclerView

=

recyclerView;

}

ifGridLayoutManager();

}

catch

(Exception

e)

{

e.printStackTrace();

}

}

private

View

getLayout(int

layoutId)

{

return

LayoutInflater.from(mContext).inflate(layoutId,

null);

}

public

void

addHeaderView(View

headerView)

{

if

(haveHeaderView())

{

throw

new

IllegalStateException("hearview

has

already

exists!");

}

else

{

//避免出现宽度自适应

ViewGroup.LayoutParams

params

=

new

ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

headerView.setLayoutParams(params);

VIEW_HEADER

=

headerView;

ifGridLayoutManager();

notifyItemInserted(0);

}

}

public

void

addFooterView(View

footerView)

{

if

(haveFooterView())

{

throw

new

IllegalStateException("footerView

has

already

exists!");

}

else

{

ViewGroup.LayoutParams

params

=

new

ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

footerView.setLayoutParams(params);

VIEW_FOOTER

=

footerView;

ifGridLayoutManager();

notifyItemInserted(getItemCount()

-

1);

}

}

private

void

ifGridLayoutManager()

{

if

(mRecyclerView

==

null)

return;

final

RecyclerView.LayoutManager

layoutManager

=

mRecyclerView.getLayoutManager();

if

(layoutManager

instanceof

GridLayoutManager)

{

final

GridLayoutManager.SpanSizeLookup

originalSpanSizeLookup

=

((GridLayoutManager)

layoutManager).getSpanSizeLookup();

((GridLayoutManager)

layoutManager).setSpanSizeLookup(new

GridLayoutManager.SpanSizeLookup()

{

@Override

public

int

getSpanSize(int

position)

{

return

(isHeaderView(position)

||

isFooterView(position))

?

((GridLayoutManager)

layoutManager).getSpanCount()

:

1;

}

});

}

}

private

boolean

haveHeaderView()

{

return

VIEW_HEADER

!=

null;

}

public

boolean

haveFooterView()

{

return

VIEW_FOOTER

!=

null;

}

private

boolean

isHeaderView(int

position)

{

return

haveHeaderView()

&&

position

==

0;

}

private

boolean

isFooterView(int

position)

{

return

haveFooterView()

&&

position

==

getItemCount()

-

1;

}

public

static

class

MyHolder

extends

RecyclerView.ViewHolder

{

public

MyHolder(View

itemView)

{

super(itemView);

}

}

}四、实现方法简单的初始化RecycerView,以及设置适配器,如下:

private

void

initRecyc()

{

//

mRecyclerView.setLayoutManager(new

GridLayoutManager(this,2));

mRecyclerView.setLayoutManager(new

LinearLayoutManager(this));

adapter

=

new

MyAdapter(data,

this);

mRecyclerView.setAdapter(adapter);

adapter.addFooterView(LayoutInflater.from(this).inflate(R.layout.item_footer_layout,null));

adapter.addHeaderView(LayoutInflater.from(this).inflate(R.layout.item_header_layout,null));

}五、注意的问题笔者在添加头部尾部的时候,发现在配置RecyclerView,如果模式是配置GridLayoutManager的时候,发现头部会跑到第一格,也就是不是自己想要独立一行的效果,这里

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论