如何使用RecyclerView显示数据库索引怎么使用中的数据

Android RecyclerView实现数据列表展示效果
作者:leehbhs
字体:[ ] 类型:转载 时间:
这篇文章主要为大家详细介绍了Android RecyclerView实现数据列表展示效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下
1.首先导入依赖:&
compile 'com.android.support:recyclerview-v7:25.3.1'
2.适配器类:&
public class NewsAdapter extends RecyclerView.Adapter {
private ArrayList&NewsData.DataBean& mlist=new ArrayList&&();
public NewsAdapter(Context mcontext) {
this.mcontext =
//找到需要导入的布局
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
view = LayoutInflater.from(mcontext).inflate(R.layout.news_item, null);
return new ViewHolder(view);
//加载相应的内容
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ViewHolder viewholder=(ViewHolder)
viewholder.textview.setText(""+getItem(position).getNews_title());
Glide.with(mcontext).load(getItem(position).getPic_url()).into(viewholder.ima);
//手写的重置数据的方法
public void setdata(ArrayList&NewsData.DataBean& list){
if (list!=null&&list.size()&0){
mlist.addAll(list);
//手写的获得视图的方法
public NewsData.DataBean getItem(int position){
return mlist.get(position);
public int getItemCount() {
return mlist.size();
//定义的ViewHolder类继承RecyclerView.ViewHolder 并找到布局中的ID
public class ViewHolder extends RecyclerView.ViewHolder{
private TextV
private ImageV
public ViewHolder(View itemView) {
super(itemView);
textview=(TextView)itemView.findViewById(R.id.tv);
ima=(ImageView)itemView.findViewById(R.id.image);
&3.主界面(用到RecyclerView的主要是initdata()方法和Handler):&
public class MainActivity extends AppCompatActivity implements IMainView{
private MainP
private NewsA
private RecyclerV
private ArrayList&NewsData.DataBean& mlist=new ArrayList&&();
private String url="/AppNews/getNewsList/type/1/p/1";
private Handler hand=new Handler(){
public void handleMessage(Message msg) {
super.handleMessage(msg);
Gson gson=new Gson();
if (msg.what==1) {
NewsData newsData = gson.fromJson(msg.obj.toString(), NewsData.class);
mlist=(ArrayList&NewsData.DataBean&) newsData.getData();
md.setdata((ArrayList&NewsData.DataBean&) mlist);
md.notifyDataSetChanged();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
initdata();
initdatafromserver();
private void initview() {
recy=(RecyclerView)findViewById(R.id.recy);
private void initdatafromserver() {
//加载网络数据,找P层去要
mainp.loadDataFromServer(url);
private void initdata() {
mainp=new MainPresenter(this);
//设置适配器
md=new NewsAdapter(this);
//创建默认的线性LayoutManager
recy.setLayoutManager(new LinearLayoutManager(this));
recy.setAdapter(md);
//重写的IMainView类接口的两个方法
public void successfulCallback(String str) {
Message msg = Message.obtain();
msg.what=1;
hand.sendMessage(msg);
public void errCallback(int code, String msg) {
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具使用RecyclerView 在加载大量数据时,快速滑动,item显示错乱? - 知乎2被浏览1953分享邀请回答还没有回答RecyclerView使用databinding出现数据闪烁问题 - 青崖绿舟 - 博客园
随笔 - 22, 文章 - 0, 评论 - 0, 引用 - 0
When something takes longer than expected, write it down.
问题产生:
最近做项目遇到RecyclerView使用databinding时,出现数据闪烁,老大说,这问题不解决就不要用databinding。。。
闪烁图效果如下,点击Refresh,数据闪了一次:
明明数据没变,但数据却刷了一遍。
代码如下:
class TestDBAdapter extends RecyclerView.Adapter&TestDBViewHolder& {
private List&TestData&
public TestDBAdapter(List&TestData& list) {
this.list =
public TestDBViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemTestDbRecyclerViewBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_test_db_recycler_view, parent, false);
return new TestDBViewHolder(binding);
public void onBindViewHolder(TestDBViewHolder holder, int position) {
holder.binding.setData(list.get(position));
holder.binding.executePendingBindings();
public int getItemCount() {
return list.size();
class TestDBViewHolder extends RecyclerView.ViewHolder {
public ItemTestDbRecyclerViewB
public TestDBViewHolder(ItemTestDbRecyclerViewBinding binding) {
super(binding.getRoot());
this.binding =
public TestDBViewHolder(View itemView) {
super(itemView);
问题追踪:
从图中可以看到item从浙江--&广东--&浙江,这个简单,因为recycler view会重用item,刷新时,第一个元素使用了第四个元素的ViewHolder。
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if (holder instanceof TaskItemViewHolder) {
final TaskItemViewHolder taskItemViewHolder = (TaskItemViewHolder)
LogUtils.d("before: "+taskItemViewHolder.getBinding().getData());//打印bind前holder中的数据
taskItemViewHolder.bindTo(mList.get(position), position);
LogUtils.d("after: "+mList.get(position)+" position:"+position);//打印当前item的数据
打印结果:
before: 广东
after: 浙江&
数据是肯定变了,难道数据闪烁是正常的,那为什么不用databinding时,没有出现数据闪烁现象?有人说全局刷新时layout重置。。。
网上不是有好多demo吗?去看看别人怎么用的,看看别人的代码是否有问题,于是下了个demo&, 安装,运行,refresh,卧槽,居然没有闪烁!!!马上追踪代码,activity-&adapter-&onCreateViewHolder-&onBindViewHolder。。。嗯?多了一行?&holder.binding.executePendingBindings();这是what?没遇到过。加上这一行后,问题居然解决了。。。
/** * Evaluates the pending bindings, updating any Views that have expressions bound to * modified variables. This &b&must&/b& be run on the UI thread. */
bindData后立即刷新!
难道要立刻刷新?还没有搞清楚。。。
问题解决:
public void onBindViewHolder(TestDBViewHolder holder, int position) {
holder.binding.setData(list.get(position));
holder.binding.executePendingBindings();//加一行,问题解决
遗留问题:
1. RecyclerView notifyDataChanged时,明明item的数据变化了,但为什么没有闪烁呢?
2.&executePendingBindings语句到底是什么用?调与不调有什么区别?&用户名:愚人cc
文章数:124
访问量:12006
注册日期:
阅读量:1297
阅读量:3317
阅读量:447423
阅读量:1132664
51CTO推荐博文
Android学习之RecyclerView&原文&&主题&RecyclerView是android-support-v7-21版本中新增的一个Widget,官方介绍RecyclerView 是 ListView 的升级版本,更加先进和灵活。开发环境&- IDE: ADT首先在Android SDK Manager上下载Android Support Repository,650) this.width=650;" src="/mArua2.jpg" alt="" class="alignCenter" style="height:vertical-align:border:0text-align:margin:0px auto 10" />它会在sdk/extras/android目录下生成m2repository目录,650) this.width=650;" src="/ZJJrYb.jpg" alt="" class="alignCenter" style="height:vertical-align:border:0text-align:margin:0px auto 10" />进入RecycleView目录。用解压文件打开recyclerview-v7-21.0.0-rc1.aar文件,将claaes.jar改名后放入lib文件夹。650) this.width=650;" src="/qMRjIr.jpg" alt="" class="alignCenter" style="height:vertical-align:border:0text-align:margin:0px auto 10" />如果想在ADT中关联源代码,可以在libs下新建文件recycleview.jar.properties&编辑src=D:\\adt-bundle-windows-x86_64-\\sdk\\extras\\android\\m2repository\\com\\android\\support\\recyclerview-v7\\21.0.0-rc1\\recyclerview-v7-21.0.0-rc1-sources.jar右键项目close project,然后open project这样就可以关联源代码了。创建项目如图650) this.width=650;" src="/ErUnQf.jpg" alt="" class="alignCenter" style="height:vertical-align:border:0text-align:margin:0px auto 10" />布局文件中使用 RecyclerView&?xml&version="1.0"&encoding="utf-8"?&&RelativeLayout&xmlns:android="/apk/res/android"&&android:layout_width="match_parent"&&android:layout_height="match_parent"&&&&&android.support.v7.widget.RecyclerView&&&&android:id="@+id/recyclerView"&&&&android:layout_width="match_parent"&&&&android:layout_height="match_parent"&/&&/RelativeLayout&Activity中package&com.leigo.
import&android.app.A
import&android.os.B
import&android.support.v7.widget.LinearLayoutM
import&android.support.v7.widget.RecyclerV/**
&*&@ClassName&RecyclerViewActivity
&*&@Description&TODO
&*&@author&GaoLei
&*/public&class&RecyclerViewActivity&extends&Activity&{&&private&static&final&String&TAG&=&RecyclerViewActivity.class&&&&&&.getSimpleName();&&private&RecyclerView&mRecyclerV&&/**&&&*&@Method:&onCreate&&&*&@Description:&TODO&&&*&@param&savedInstanceState&&&*&@see&android.app.Activity#onCreate(android.os.Bundle)&&&*/&&@Override&&protected&void&onCreate(Bundle&savedInstanceState)&{&&&&super.onCreate(savedInstanceState);&&&&setContentView(R.layout.activity_recycle_view);&&&&mRecyclerView&=&(RecyclerView)&findViewById(R.id.recyclerView);&&&&LinearLayoutManager&layoutManager&=&new&LinearLayoutManager(this);//
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);&&&&//&设置布局管理器&&&&mRecyclerView.setLayoutManager(layoutManager);&&&&String[]&dataset&=&new&String[100];&&&&for&(int&i&=&0;&i&&&dataset.&i++)&{&&&&&&dataset[i]&=&"item"&+&i;&&&&}&&&&RecyclerAdapter&mAdapter&=&new&RecyclerAdapter(dataset);&&&&mRecyclerView.setAdapter(mAdapter);&&}
&/strong&RecyclerView 一个特点就是,将 layout 抽象成了一个 LayoutManager,RecylerView 不负责子 View 的布局, 我们可以自定义 LayoutManager 来实现不同的布局效果, 目前只提供了LinearLayoutManager。 LinearLayoutManager 可以指定方向,默认是垂直, 可以指定水平, 这样就轻松实现了水平的 ListView。Adapterpackage&com.leigo.import&android.support.v7.widget.RecyclerVimport&android.support.v7.widget.RecyclerView.Aimport&android.view.Vimport&android.view.ViewGimport&android.widget.TextV/**
&*&@ClassName&RecyclerAdapter
&*&@Description&TODO
&*&@author&GaoLei
&*/public&class&RecyclerAdapter&extends&Adapter&RecyclerAdapter.ViewHolder&&{&&private&String[]&mD&&/**&&&*&@Description:&TODO&&&*/&&public&RecyclerAdapter(String[]&dataset)&{&&&&mDataset&=&&&}&&public&static&class&ViewHolder&extends&RecyclerView.ViewHolder&{&&&&public&TextView&mTextV&&&&/**&&&&&*&@Description:&TODO&&&&&*&@param&itemView&&&&&*/&&&&public&ViewHolder(View&itemView)&{&&&&&&super(itemView);&&&&&&mTextView&=&(TextView)&itemV&&&&}&&}&&/**&&&*&@Method:&getItemCount&&&*&@Description:&TODO&&&*&@return&&&*&@see&android.support.v7.widget.RecyclerView.Adapter#getItemCount()&&&*/&&@Override&&public&int&getItemCount()&{&&&&return&mDataset.&&}&&/**&&&*&@Method:&onBindViewHolder&&&*&@Description:&TODO&&&*&@param&holder&&&*&@param&position&&&*&@see&android.support.v7.widget.RecyclerView.Adapter#onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder,&&&*&&&&&&int)&&&*/&&@Override&&public&void&onBindViewHolder(ViewHolder&holder,&int&position)&{&&&&holder.mTextView.setText(mDataset[position]);&&}&&/**&&&*&@Method:&onCreateViewHolder&&&*&@Description:&TODO&&&*&@param&parent&&&*&@param&viewType&&&*&@return&&&*&@see&android.support.v7.widget.RecyclerView.Adapter#onCreateViewHolder(android.view.ViewGroup,&&&*&&&&&&int)&&&*/&&@Override&&public&ViewHolder&onCreateViewHolder(ViewGroup&parent,&int&viewType)&{&&&&View&view&=&View.inflate(parent.getContext(),&&&&&&&&android.R.layout.simple_list_item_1,&null);&&&&ViewHolder&holder&=&new&ViewHolder(view);&&&&return&&&}
}RecyclerView 的另一个特点是标准化了 ViewHolder, 编写 Adapter 面向的是 ViewHoder 而不在是View 了, 复用的逻辑被封装了, 写起来更加简单。截图650) this.width=650;" src="/UJNvUf.png" alt="" class="alignCenter" style="height:vertical-align:border:0text-align:margin:0px auto 10" />650) this.width=650;" src="/ZJ7bAz.png" alt="" class="alignCenter" style="height:vertical-align:border:0text-align:margin:0px auto 10" />
了这篇文章
类别:┆阅读(0)┆评论(0)RecyclerView完全解析,让你从此爱上它(二十八)
(一).前言:
话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比ListView,GridView之类控件有很多的优点,例如:数据绑定,Item View创建,View的回收以及重用等机制。那么今天开始我们来重点学习一下RecyclerView控件,本系列文章会包括到以下三个部分:
RecyclerView控件的基本使用,包括基础,进阶,高级部分,动画之类
RecyclerView控件的实战实例
RecyclerView控件集合AA( Annotations)注入框架实例
那么今天我们首先来看第一部分:RecyclerView控件的基本使用,进阶,动画相关知识点。本次讲解所有用的Demo例子已经全部更新到下面的项目中了,欢迎大家star和fork。
&&&&&&&& FastDev4Android框架项目地址:/jiangqqlmj/FastDev4Android
(二).RecyclerView基本介绍:&&
&&&&&&&& 通过使用RecyclerView控件,我们可以在APP中创建带有Material Design风格的复杂列表。RecyclerView控件和ListView的原理有很多相似的地方,都是维护少量的View来进行显示大量的数据,不过RecyclerView控件比ListView更加高级并且更加灵活。当我们的数据因为用户事件或者网络事件发生改变的时候也能很好的进行显示。和ListView不同的是,RecyclerView不用在负责Item的显示相关的功能,在这边所有有关布局,绘制,数据绑定等都被分拆成不同的类进行管理,下面我这边会一个个的进行讲解。同时RecyclerView控件提供了以下两种方法来进行简化和处理大数量集合:
采用LayoutManager来处理Item的布局
提供Item操作的默认动画,例如在增加或者删除item的时候
你也可以自定义LayoutManager或者设置添加/删除的动画,整体的RecyclerView结构图如下:
为了使用RecyclerView控件,我们需要创建一个Adapter和一个LayoutManager:
Adapter:继承自RecyclerView.Adapetr类,主要用来将数据和布局item进行绑定。
LayoutManager:布局管理器,设置每一项view在RecyclerView中的位置布局以及控件item view的显&&&&&
示或者隐藏.当View重用或者回收的时候,LayoutManger都会向Adapter来请求新的数据来进行替换原来数据的内容。这种回收重用的机制可以提供性能,避免创建很多的view或者是频繁的调用findViewById方法。这种机制和ListView还是很相似的。
&&&&&&&&& RecyclerView提供了三种内置的LayoutManager:
LinearLayoutManager:线性布局,横向或者纵向滑动列表
GridLayoutManager:表格布局
StaggeredGridLayoutManager:流式布局,例如瀑布流效果
当然除了上面的三种内部布局之外,我们还可以继承RecyclerView.LayoutManager来实现一个自定义的LayoutManager。
&&&&&&&&&& Animations(动画)效果:
&&&&&&&&&& RecyclerView对于Item的添加和删除是默认开启动画的。我们当然也可以通过RecyclerView.ItemAnimator类定制动画,然后通过RecyclerView.setItemAnimator()方法来进行使用。
&&&&&&&&&& RecyclerView相关类:
(三).RecyclerView基本实现:&
&&&& 我这边实例采用Android Studio 1.3.2。
dependencies&{&&
&&&&compile'com.android.support:recyclerview-v7:23.1.1'&&
&&&&&& 2.新建布局,引入RecyclerView控件:
[html] view plaincopy
&?xmlversionxmlversion=&1.0&&encoding=&utf-8&?&&&
&LinearLayoutxmlns:androidLinearLayoutxmlns:android=&/apk/res/android&&&
&&&&android:orientation=&vertical&android:layout_width=&match_parent&&&
&&&android:layout_height=&match_parent&&&&
&&&&&includelayoutincludelayout=&@layout/common_top_bar_layout&/&&&
&&&&&android.support.v7.widget.RecyclerView&&
&&&&&&&android:id=&@+id/recyclerView_one&&&
&&&&&&&android:layout_width=&match_parent&&&
&&&&&&&android:layout_height=&match_parent&&&
&&&&&&&&android:scrollbars=&vertical&&&
&&&&&&&&&/android.support.v7.widget.RecyclerView&&&
&/LinearLayout&&&
&&&&& 3.在Activity中获取RecyclerView控件然后进行设置LayoutManger以及Adapter即可,和ListView的写法有点类似:
[java] view plaincopy
&*&当前类注释:RecyclerView使用实例测试demo&
&*&项目名:FastDev4Android&
&*&包名:com.chinaztt.fda.test&
&*&作者:江清清&on&15/11/17&15:10&
&*&邮箱:&
&*&公司:江苏中天科技软件技术有限公司&
public&class&RecyclerViewTestActivity&extends&BaseActivity&{&&
&&&&private&LinearLayout&top_bar_linear_&&
&&&&private&TextView&top_bar_&&
&&&&private&RecyclerView&recyclerView_&&
&&&&private&RecyclerView.Adapter&mA&&
&&&&private&LinearLayoutManager&mLayoutM&&
&&&&@Override&&
&&&&protected&void&onCreate(BundlesavedInstanceState)&{&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&setContentView(R.layout.recyclerview_test_layout);&&
&&&&&&&top_bar_linear_back=(LinearLayout)this.findViewById(R.id.top_bar_linear_back);&&
&&&&&&&top_bar_linear_back.setOnClickListener(new&CustomOnClickListener());&&
&&&&&&&top_bar_title=(TextView)this.findViewById(R.id.top_bar_title);&&
&&&&&&&top_bar_title.setText(&RecyclerView使用实例&);&&
&&&&&&&&//开始设置RecyclerView&&
&&&&&&&recyclerView_one=(RecyclerView)this.findViewById(R.id.recyclerView_one);&&
&&&&&&&&//设置固定大小&&
&&&&&&&&recyclerView_one.setHasFixedSize(true);&&
&&&&&&&&//创建线性布局&&
&&&&&&&&mLayoutManager&=&newLinearLayoutManager(this);&&
&&&&&&&&&//垂直方向&&
&&&&&&&mLayoutManager.setOrientation(OrientationHelper.VERTICAL);&&
&&&&&&&&//给RecyclerView设置布局管理器&&
&&&&&&&recyclerView_one.setLayoutManager(mLayoutManager);&&
&&&&&&&&//创建适配器,并且设置&&
&&&&&&&&mAdapter&=&newTestRecyclerAdapter(this);&&
&&&&&&&&recyclerView_one.setAdapter(mAdapter);&&
&&&&class&CustomOnClickListener&implements&View.OnClickListener{&&
&&&&&&&&@Override&&
&&&&&&&&public&void&onClick(View&v)&{&&
&&&&&&&&&&&RecyclerViewTestActivity.this.finish();&&
&&&&&&&&}&&
& & &4.自定义一个适配器来进行创建item view以及绑定数据
[java] view plaincopy
&*&当前类注释:RecyclerView&数据自定义Adapter&
&*&项目名:FastDev4Android&
&*&包名:com.chinaztt.fda.adapter.base&
&*&作者:江清清&on&15/11/18&22:29&
&*&邮箱:&
&*&公司:江苏中天科技软件技术有限公司&
public&class&TestRecyclerAdapter&extends&RecyclerView.Adapter&TestRecyclerAdapter.ViewHolder&{&&
&&&&private&LayoutInflater&mI&&
&&&&private&String[]&mTitles=&&
&&&&public&TestRecyclerAdapter(Context&context){&&
&&&&&&&this.mInflater=LayoutInflater.from(context);&&
&&&&&&&&this.mTitles=new&String[20];&&
&&&&&&&&for&(int&i=0;i&20;i++){&&
&&&&&&&&&&&&int&index=i+1;&&
&&&&&&&&&&&&mTitles[i]=&item&+&&
&&&&&&&&}&&
&&&&&*&item显示类型&
&&&&&*&@param&parent&
&&&&&*&@param&viewType&
&&&&&*&@return&
&&&&@Override&&
&&&&public&ViewHolder&onCreateViewHolder(ViewGroup&parent,&int&viewType)&{&&
&&&&&&&&Viewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);&&
&&&&&&&&//view.setBackgroundColor(Color.RED);&&
&&&&&&&&ViewHolder&viewHolder=new&ViewHolder(view);&&
&&&&&&&&return&viewH&&
&&&&&*&数据的绑定显示&
&&&&&*&@param&holder&
&&&&&*&@param&position&
&&&&@Override&&
&&&&public&void&onBindViewHolder(ViewHolder&holder,&int&position)&{&&
&&&&&&&holder.item_tv.setText(mTitles[position]);&&
&&&&@Override&&
&&&&public&int&getItemCount()&{&&
&&&&&&&&return&mTitles.&&
&&&&//自定义的ViewHolder,持有每个Item的的所有界面元素&&
&&&&public&static&class&ViewHolder&extends&RecyclerView.ViewHolder&{&&
&&&&&&&&public&TextView&item_&&
&&&&&&&&public&ViewHolder(View&view){&&
&&&&&&&&&&&&super(view);&&
&&&&&&&&&&&&item_tv&=&(TextView)view.findViewById(R.id.item_tv);&&
&&&&&&&&}&&
& & & & &&这个自定义Adapter和我们在使用Listview时候的Adapter相比还是有点不太一样的,首先这边我们需要继承RecyclerView.Adaper类,然后实现两个重要的方法onBindViewHodler()以及onCreateViewHolder(),这边我们看出来区别,使用RecyclerView控件我们就可以把Item View视图创建和数据绑定这两步进行分来进行管理,用法就更加方便而且灵活了,并且我们可以定制打造千变万化的布局。同时这边我们还需要创建一个ViewHolder类,该类必须继承自RecyclerView.ViewHolder类,现在Google也要求我们必须要实现ViewHolder来承载Item的视图。
&&&&&&& 该Demo运行效果如下:
&&&& 上面的例子我们这边比较简单使用LinearLayoutManager来实现了,其中布局是采用垂直布局的,当然我们还可以设置线性布局的方向为横向,只要如下设置即可:
[java] view plaincopy
mLayoutManager.setOrientation(OrientationHelper.HORIZONTAL);&&
运行效果如下:
那么另外两种内置的布局如下:
&1.GridLayoutManger:使用如下设置:
[java] view plaincopy
GridLayoutManager&girdLayoutManager=new&GridLayoutManager(this,4);&&
&recyclerView_one.setLayoutManager(girdLayoutManager);&&
运行效果如下:
&2.GridLayoutManger:使用如下设置:
[java] view plaincopy
StaggeredGridLayoutManager&staggeredGridLayoutManager=new&&&StaggeredGridLayoutManager(2,OrientationHelper.VERTICAL);&&
&&recyclerView_one.setLayoutManager(staggeredGridLayoutManager);&&
(四).RecyclerView分隔线实现(ItemDecoration):
& & & & & &&大家肯定观察到上面的显示效果还是比较丑,例如就没有分隔线这个效果,下面我们一起来实现以下分隔线的效果。还记得前面的一个表格中有写关于RecyclerView的相关类:
RecyclerView.ItemDecoration
给每一项Item视图添加子View,可以进行画分隔线之类的东西
&&&&&&&&& 我们可以创建一个继承RecyclerView.ItemDecoration类来绘制分隔线,通过ItemDecoration可 以让我们每一个Item从视觉上面相互分开来,例如ListView的divider非常相似的效果。当然像我们上面的例子ItemDecoration 我们没有设置也没有报错哦,那说明ItemDecoration我们并不是强制需要使用,作为我们开发者可以设置或者不设置Decoration的。实现一个ItemDecoration,提供的ItemDecoration是一个抽象类,内部除去已经废弃的方法以外,我们主要实现以下三个方法:
[java] view plaincopy
public&static&abstract&class&ItemDecoration&{&&
&&&&&&&&&&public&void&onDraw(Canvas&c,RecyclerView&parent,&State&state)&{&&
&&&&&&&&&&&&onDraw(c,&parent);&&
&&&&&&&&}&&
&&&&&&&&public&void&onDrawOver(Canvas&c,RecyclerView&parent,&State&state)&{&&
&&&&&&&&&&&&onDrawOver(c,&parent);&&
&&&&&&&&}&&
&&&&&&&&public&void&getItemOffsets(RectoutRect,&View&view,&RecyclerView&parent,&State&state)&{&&
&&&&&&&&&&&&getItemOffsets(outRect,((LayoutParams)&view.getLayoutParams()).getViewLayoutPosition(),&&
&&&&&&&&&&&&&&&&&&&&parent);&&
&&&&&&&&}&&
&&&&&&&&& 又因为当我们RecyclerView在进行绘制的时候会进行绘制Decoration,那么会去调用onDraw和onDrawOver方法,那么这边我们其实只要去重写onDraw和getItemOffsets这两个方法就可以实现啦。然后LayoutManager会进行Item布局的时候,回去调用getItemOffset方法来计算每个Item的Decoration合适的尺寸,下面我们来具体实现一个Decoration。TestDecoration.java
[java] view plaincopy
&*&当前类注释:自定义实现一个Decoration分隔线&
&*&项目名:FastDev4Android&
&*&包名:com.chinaztt.fda.widget&
&*&作者:江清清&on&15/11/19&12:29&
&*&邮箱:&
&*&公司:江苏中天科技软件技术有限公司&
public&class&TestDecoration&extends&RecyclerView.ItemDecoration&{&&
&&&&//采用系统内置的风格的分割线&&
&&&&private&static&final&int[]&attrs=newint[]{android.R.attr.listDivider};&&
&&&&private&Drawable&mD&&
&&&&public&TestDecoration(Context&context)&{&&
&&&&&&&&TypedArray&typedArray=context.obtainStyledAttributes(attrs);&&
&&&&&&&&mDivider=typedArray.getDrawable(0);&&
&&&&&*&进行自定义绘制&
&&&&&*&@param&c&
&&&&&*&@param&parent&
&&&&&*&@param&state&
&&&&@Override&&
&&&&public&void&onDraw(Canvas&c,&RecyclerView&parent,&RecyclerView.State&state)&{&&
&&&&&&&&int&top=parent.getPaddingTop();&&
&&&&&&&&intbottom=parent.getHeight()-parent.getPaddingBottom();&&
&&&&&&&&int&childCount=parent.getChildCount();&&
&&&&&&&&for(int&i=0;i&childCi++){&&
&&&&&&&&&&&&View&child=parent.getChildAt(i);&&
&&&&&&&&&&&&RecyclerView.LayoutParams&layoutParams=(RecyclerView.LayoutParams)child.getLayoutParams();&&
&&&&&&&&&&&&intleft=child.getRight()+layoutParams.rightM&&
&&&&&&&&&&&&intright=left+mDivider.getIntrinsicWidth();&&
&&&&&&&&&&&mDivider.setBounds(left,top,right,bottom);&&
&&&&&&&&&&&&mDivider.draw(c);&&
&&&&&&&&}&&
&&&&@Override&&
&&&&public&void&getItemOffsets(Rect&outRect,View&view,&RecyclerView&parent,&RecyclerView.State&state)&{&&
&&&&&&&outRect.set(0,0,mDivider.getIntrinsicWidth(),0);&&
&&&&&&&&&&& 我这边实例中采用系统主题(android.R.attr.listDivider)来设置成分隔线的,然后来获取尺寸,位置进行setBound(),绘制,接着通过outRect.set()来设置绘制整个区域范围,最后不要忘记往RecyclerView中设置该自定义的分割线,
//添加分隔线
[java] view plaincopy
recyclerView_one.addItemDecoration(newTestDecoration(this));&&
运行效果如下:
&&&&&&&& 上面的分割线效果只是垂直画了分割线,但是我们水平方向也要进行画分割线,那么我们下面对于自定义的Decoration进行改进,AdvanceDecoration.java就出现啦。
[java] view plaincopy
&*&当前类注释:改进之后的自定义Decoration分割线&
&*&项目名:FastDev4Android&
&*&包名:com.chinaztt.fda.widget&
&*&作者:江清清&on&15/11/19&12:53&
&*&邮箱:&
&*&公司:江苏中天科技软件技术有限公司&
public&class&AdvanceDecoration&extends&RecyclerView.ItemDecoration{&&
&&&&//采用系统内置的风格的分割线&&
&&&&private&static&final&int[]&attrs=newint[]{android.R.attr.listDivider};&&
&&&&private&Drawable&mD&&
&&&&private&int&&&
&&&&public&AdvanceDecoration(Contextcontext,int&orientation)&{&&
&&&&&&&&TypedArray&typedArray=context.obtainStyledAttributes(attrs);&&
&&&&&&&&mDivider=typedArray.getDrawable(0);&&
&&&&&&&&typedArray.recycle();&&
&&&&&&&&this.orientation=&&
&&&&@Override&&
&&&&public&void&onDraw(Canvas&c,&RecyclerView&parent,&RecyclerView.State&state)&{&&
&&&&&&&&&&&&&&&&&drawHDeraction(c,parent);&&
&&&&&&&&&&&&&&&&&drawVDeraction(c,parent);&&
&&&&&*&绘制水平方向的分割线&
&&&&&*&@param&c&
&&&&&*&@param&parent&
&&&&private&void&drawHDeraction(Canvas&c,RecyclerView&parent){&&
&&&&&&&&int&left=parent.getPaddingLeft();&&
&&&&&&&&intright=parent.getWidth()-parent.getPaddingRight();&&
&&&&&&&&int&childCount=parent.getChildCount();&&
&&&&&&&&for(int&i=0;i&childCi++){&&
&&&&&&&&&&&&View&child=parent.getChildAt(i);&&
&&&&&&&&&&&&RecyclerView.LayoutParams&layoutParams=(RecyclerView.LayoutParams)child.getLayoutParams();&&
&&&&&&&&&&&&inttop=child.getBottom()+layoutParams.bottomM&&
&&&&&&&&&&&&intbottom=top+mDivider.getIntrinsicHeight();&&
&&&&&&&&&&&mDivider.setBounds(left,top,right,bottom);&&
&&&&&&&&&&&&mDivider.draw(c);&&
&&&&&&&&}&&
&&&&&*&绘制垂直方向的分割线&
&&&&&*&@param&c&
&&&&&*&@param&parent&
&&&&private&void&drawVDeraction(Canvas&c,RecyclerView&parent){&&
&&&&&&&&int&top=parent.getPaddingTop();&&
&&&&&&&&intbottom=parent.getHeight()-parent.getPaddingBottom();&&
&&&&&&&&int&childCount=parent.getChildCount();&&
&&&&&&&&for(int&i=0;i&childCi++){&&
&&&&&&&&&&&&View&child=parent.getChildAt(i);&&
&&&&&&&&&&&&RecyclerView.LayoutParamsla&youtParams=(RecyclerView.LayoutParams)child.getLayoutParams();&&
&&&&&&&&&&&&intleft=child.getRight()+layoutParams.rightM&&
&&&&&&&&&&&&intright=left+mDivider.getIntrinsicWidth();&&
&&&&&&&&&&&mDivider.setBounds(left,top,right,bottom);&&
&&&&&&&&&&&&mDivider.draw(c);&&
&&&&&&&&}&&
&&&&@Override&&
&&&&public&void&getItemOffsets(Rect&outRect,View&view,&RecyclerView&parent,&RecyclerView.State&state)&{&&
&&&&&&&if(OrientationHelper.HORIZONTAL==orientation){&&
&&&&&&&&&&&&outRect.set(0,&0,mDivider.getIntrinsicWidth(),&0);&&
&&&&&&&&}else&{&&
&&&&&&&&&&&&outRect.set(0,&0,&0,mDivider.getIntrinsicHeight());&&
&&&&&&&&}&&
&&&&&&&&&& 改良之后的自定义分割器的构造函数中新增一个int参数,用来表示横向还是纵向布局,这样我们可以分别来绘制分割线。具体使用方法:
recyclerView_one.addItemDecoration(newAdvanceDecoration(this,OrientationHelper.VERTICAL));
运行比较效果如下:
(五).RecyclerView高级用户(监听事件处理)
&&&&&&&&& 我们知道在ListView使用的时候,该控件给我们提供一个onItemClickListener监听器,这样当我们的item发生触发事件的时候,会回调相关的方法,以便我们方便处理Item点击事件。对于RecyclerView来讲,非常可惜的时候,该控件没有给我们提供这样的内置监听器方法,不过我们可以进行改造实现。我们先来看一下之前我们写得TestRecyclerAdapter中的onCreateViewHolder()方法中的代码:
[java] view plaincopy
public&ViewHolder&onCreateViewHolder(ViewGroupparent,&int&viewType)&{&&
&&&&&&&Viewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);&&
&&&&&&&//这边可以做一些属性设置,甚至事件监听绑定&&
&&&&&&&//view.setBackgroundColor(Color.RED);&&
&&&&&&&ViewHolder&viewHolder=newViewHolder(view);&&
&&&&&&&return&viewH&&
&&&&&&&&& 该方法创建一个ViewHolder,其中承载的就是每一项Item View视图,那么我们可以在view创建出来之后给它进行添加相应的属性或者监听方法,例如:背景颜色,大小,以及点击事件。既然可以这样解决,OK,我们给View添加一个onClickListener监听器,然后点击的时候回调onClick()方法。同时我们需要自定义一个类似于onItemClickListener()的监听器来处理。&&&&&
[java] view plaincopy
&&&&&*&自定义RecyclerView&中item&view点击回调方法&
&&&&interface&OnRecyclerItemClickListener{&&
&&&&&&&&/**&
&&&&&&&&&*&item&view&回调方法&
&&&&&&&&&*&@param&view&&被点击的view&
&&&&&&&&&*&@param&position&点击索引&
&&&&&&&&&*/&&
&&&&&&&&void&onItemClick(View&view,&intposition);&&
然后声明以及Adapter初始化的时候传入进去:
[java] view plaincopy
public&&TestRecyclerAdapter(Contextcontext,OnRecyclerItemClickListener&onRecyclerItemClickListener){&&
&&&&&&&&&&..&&
&&&&&&&this.onRecyclerItemClickListener=onRecyclerItemClickL&&
&&& 然后我们在onClick回调方法中调用OnRecyclerItemClickListener接口的方法。
[java] view plaincopy
view.setOnClickListener(new&View.OnClickListener()&{&&
&&&&&&&&&@Override&&
&&&&&&&&&public&void&onClick(View&v)&{&&
&&&&&&&&&&&&if(onRecyclerItemClickListener!=null){&&
&&&&&&&&&&&&&&&&onRecyclerItemClickListener.onItemClick(view,&(int)view.getTag());&&
&&&&&&&&&&&&&}&&
&&&&&&&&&}&&
&&&&&});&&
&&&& 上面的onItemClick中第二个参数的position,采用view.getTag的方法获取,那么我们就需要在onBindViewHolder()方法中设置一个tag了.
[java] view plaincopy
public&voidonBindViewHolder(ViewHolder&holder,&int&position)&{&&
&&&&&&&holder.item_tv.setText(mTitles[position]);&&
&&&&&&&&holder.itemView.setTag(position);&&
&&& 最后我们在外部使用一下接口:&
[java] view plaincopy
mAdapter&=&new&TestRecyclerAdapter(this,&new&TestRecyclerAdapter.OnRecyclerItemClickListener()&{&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&onItemClick(View&view,int&position)&{&&
&&&&&&&&&&&&&&&Toast.makeText(RecyclerViewTestActivity.this,&&点击了第&+position+&项&,&Toast.LENGTH_SHORT).show();&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&& 运行结果如下:
(六).RecyclerView数据添加删除处理
&&&& 讲了以上RecyclerView中各种用户,处理之后,现在我们来看一下当数据发生变化之后的处理。例如我们在使用ListView的时候,当数据发生变化的时候可以通过notifyDatasetChange()来刷新界面。对于RecyclerView控件来讲,给我们提供更加高级的使用方法notifyItemInserted(position)和notifyItemRemoved(position)
&&&& 我们可以在TestRecyclerAdapter中添加数据新增和数据删除的方法如下:
[java] view plaincopy
//添加数据&&
&public&void&addItem(String&data,&intposition)&{&&
&&&&&mTitles.add(position,&data);&&
&&&&&notifyItemInserted(position);&&
&//删除数据&&
&public&void&removeItem(String&data)&{&&
&&&&&int&position&=&mTitles.indexOf(data);&&
&&&&&mTitles.remove(position);&&
&&&&&notifyItemRemoved(position);&&
& &然后我们在Activity中进行调用即可:
[java] view plaincopy
//添加数据&&
mAdapter.addItem(&additem&,5);&&
//删除数据&&
mAdapter.removeItem(&item4&);&&
& 在运行之前我们不要忘记RecyclerView给提供了动画设置,我这边就直接采用了默认动画,设置方法如下:
[java] view plaincopy
//添加默认的动画效果&&
recyclerView_one.setItemAnimator(new&DefaultItemAnimator());&&
最终运行效果如下图:
(七).RecyclerView总结
&到此为止就完成我们RecyclerView控件使用的第一讲内容,其中包括控件的基本介绍,基本使用,高级用法(自定义间隔符,加入点击监听事件以及Item添加删除动画处理)。 总体来讲RecyclerView控件是非常不错,尤其在布局以及数据绑定,动画方面,除了系统内置的三种布局方式之外,我们还可以定制出我们自己的布局 管理器。同时当item数据发生变化的时候还给我们提供非常炫的效果。相信大家在今天这一讲之后,会越来越爱上RecyclerView控件的使用,从此 可以抛弃ListView和GridView啦.
本次具体实例注释过的全部代码已经上传到FastDev4Android项目中了。同时欢迎大家去Github站点进行clone或者下载浏览:
/jiangqqlmj/FastDev4Android&同时欢迎大家star和fork整个开源快速开发框架项目~下一讲我们会通过一个具体实例来自定义实现一个广告条控件实例。& &&

我要回帖

更多关于 oracle数据库使用 的文章

 

随机推荐