RecyclerView简单的使用
来源:互联网 发布:8寸windows平板电脑 编辑:程序博客网 时间:2024/05/20 06:09
RecyclerView的使用
1 引入recyclerView
在moudle中的build.gradle文件里,找到dependencies,添加关于recyclerView的引用:
compile 'com.android.support:recyclerview-v7:24.2.0'
其实design包中含有Material Design相关的很多控件,其中也包括了recyclerView的代码,所以你也可以通过引用design包来使用recyclerView:
compile 'com.android.support:design:23.2.0'
注意:所引用的依赖包版本需要和自己dependencies中对应的support:v7包版本一致才能使用
2 在xml中写一个recyclerView
在MainActivity中添加一个RecyclerView进行展示,代码如下:
<!--省略不提...--> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recyclerView"/><!--省略不提...-->
3 在java中给recyclerView设置数据
在MainActivity中的代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); } private void initData() { ArrayList<String> datas = new ArrayList<>(); for(char i ='A';i<='Z';i++){ datas.add(i+""); } mAdapter = new MyAdapter(datas); rv.setAdapter(mAdapter); } private void initView() { rv = (RecyclerView) findViewById(R.id.recyclerView); //必须要指定展示的效果,设置一个LayoutManager,不然还是会一片空白 LinearLayoutManager llm = new LinearLayoutManager(getApplicationContext()); rv.setLayoutManager(llm); }
在MyAdapter中的代码如下:
public class MyAdapter extends RecyclerView.Adapter { private ArrayList<String> datas; private Context mContext; public MyAdapter(Context applicationContext, ArrayList<String> datas) { this.datas = datas; this.mContext = applicationContext; } //RecyclerView的Adapter已经集成了ViewHolder //getView中的两段逻辑 1 创建view对象(将xml转为view) 2 找到view对象里面的一些控件,对其进行一些展示的设置 //onCreateViewHolder 中执行第一段逻辑,创建出view,设置到一个ViewHolder中,再将holder返回 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //第三个参数为false,如果为true的话,生成的这个view其实就是第二个参数指向的parent,会造成报错的 View view = LayoutInflater.from(mContext).inflate(R.layout.item_recyclerview, parent,false); MyViewHolder holder = new MyViewHolder(view); return holder; } //给holder里的控件设置数据 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((MyViewHolder)holder) .mTextView.setText(datas.get(position)); } //Count 控制控件有多少个item @Override public int getItemCount() { return datas.size(); }}class MyViewHolder extends RecyclerView.ViewHolder{ public TextView mTextView; public MyViewHolder(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.tv_item); }}
4 给recyclerView设置不同的展示效果
设置多个按钮来修改recyclerView的不同的显示方式
<LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="wrap_content"> <Button android:id="@+id/action_listview" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" android:text="listView" app:showAsAction="never"/> <Button android:id="@+id/action_gridview" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" android:text="gridView"/> <Button android:id="@+id/action_hor_gridview" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" android:text="横向的gridView"/> <Button android:id="@+id/action_stagger" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" android:text="交错的瀑布流"/></LinearLayout>
然后在MainActivity中,修改菜单代码:
@Override public void onClick(View v) { switch (v.getId()) { case R.id.action_listview: LinearLayoutManager llm = new LinearLayoutManager(this); rv.setLayoutManager(llm); break; case R.id.action_gridview: GridLayoutManager rlm = new GridLayoutManager(this, 3); rv.setLayoutManager(rlm); break; case R.id.action_hor_gridview: GridLayoutManager hrlm = new GridLayoutManager(this, 3, GridLayoutManager.HORIZONTAL, false); rv.setLayoutManager(hrlm); break; case R.id.action_stagger: StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL); rv.setLayoutManager(sglm); break; } }
其实就是设置了不同的LayoutManager给RecyclerView而已。
5 给RecyclerView 设置添加和删除item的方法
先给Adapter设置两个方法
/** * 添加Item的方法 * @param position 所添加的位置 * @param item 所添加的内容(这里以String为例) */public void addItem(int position, String item){}/** * 删除Item的方法 * @param position 所删除的位置 */public void deleteItem(int position){}
然后再给对应的方法实现功能,可以直接修改集合里面的内容
/** * 添加Item的方法 * @param position 所添加的位置 * @param item 所添加的内容(这里以String为例) */public void addItem(int position, String item){ datas.add(position,item); //notifyDataSetChanged(); notifyItemInserted(position);}/** * 删除Item的方法 * @param position 所删除的位置 */public void deleteItem(int position){ datas.remove(position); //notifyDataSetChanged(); notifyItemRemoved(position);}
通常的ListView都是使用notifyDataSetChanged();这个方法刷新,recyclerView 使用它对应的
(添加 notifyItemInserted(position);)(删除notifyItemRemoved(position);)方法,在修改对应item的时候会有动画效果产生
再添加两个按钮,点击时就插入、删除数据。修改xml代码如下:
<LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="wrap_content"> ... <Button android:id="@+id/action_add" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" android:text="添加"/> <Button android:id="@+id/action_delete" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" android:text="删除"/></LinearLayout>
在MainActivity中调用方法代码如下:
@Override public void onClick(View v) { switch (v.getId()) { ... case R.id.action_add: mAdapter.addItem(2,"加进去的"); break; case R.id.action_delete: mAdapter.deleteItem(2); break; } }
6 给RecyclerView设置动画效果
可以通过rv.setItemAnimator();设置动画,里面可以new 一个相关的类,并实现对应的方法写出自己所需要实现的动画效果.
rv.setItemAnimator(new DefaultItemAnimator());rv.setItemAnimator(new RecyclerView.ItemAnimator() {});rv.setItemAnimator(new SimpleItemAnimator() {});
通过寻找,在GitHub上面找到了一个已经实现好了的recyclerView的动画效果集合, 基本上可以满足所需要的动画效果:[recyclerView animators][https://github.com/wasabeef/recyclerview-animators ]
把下面对应的动画对象放入方法中,就能实现对应的动画效果
Cool
LandingAnimator
Scale
ScaleInAnimator, ScaleInTopAnimator, ScaleInBottomAnimator
ScaleInLeftAnimator, ScaleInRightAnimator
Fade
FadeInAnimator, FadeInDownAnimator, FadeInUpAnimator
FadeInLeftAnimator, FadeInRightAnimator
Flip
FlipInTopXAnimator, FlipInBottomXAnimator
FlipInLeftYAnimator, FlipInRightYAnimator
Slide
SlideInLeftAnimator, SlideInRightAnimator, OvershootInLeftAnimator, OvershootInRightAnimator
SlideInUpAnimator, SlideInDownAnimator
代码如下:
LandingAnimator scaleInAnimator = new LandingAnimator();rv.setItemAnimator(scaleInAnimator);ScaleInAnimator animator = new ScaleInAnimator();rv.setItemAnimator(animator);...
7 给ReyclerView添加点击效果
RecyclerView没有提供OnItemClick相关的item点击方法,需要自己去实现。这里是通过在Adapter中去实现的。在Adapter中先自定义一个OnItemClickListener,然后在Adapter中的onBindViewHolder方法中,给holder.itemView设置OnClickListener,并在OnClickListener的点击方法中,调用自定义的OnItemClickListener。代码如下:
//给holder里的控件设置数据 @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { ((MyViewHolder)holder) .mTextView.setText(datas.get(position)); //给item添加一个点击 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {// Toast.makeText(mContext, "点击了item"+position, Toast.LENGTH_SHORT).show(); mOnItemClickListener.onItemClick(position,holder.itemView); } }); } public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.mOnItemClickListener = onItemClickListener; } private OnItemClickListener mOnItemClickListener = null; public interface OnItemClickListener{ void onItemClick(int position,View itemView); }
然后在MainActivity中设置自定义的OnItemClickListener即可。代码如下:
private void initData() { .... mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onItemClick(int position, View itemView) { Toast.makeText(MainActivity.this, "position: "+position, Toast.LENGTH_SHORT).show(); } }); }
8 给RecyclerView设置分割线
RecyclerView不像ListView,它没有已设置好的分割线,需要自己处理。给RecyclerView设置分割线需要执行以下代码:
rv.addItemDecoration(new RecyclerView.ItemDecoration() { String str = "我是分割线"; @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { .... c.drawText(str,left,top,paint); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { //通过outRect设置各个item之间的位移间距 outRect.set(0,0,0,getStringHeight(paint)); } });
需要给RecyclerView设置一个ItemDecoration,如果不想自己去实现里面的方法,可以参考一些三方库,如:[recyclerview-flexibledivider][https://github.com/yqritc/RecyclerView-FlexibleDivider ]
- RecyclerView的简单使用
- RecyclerView 的简单使用
- recyclerview的简单使用
- Recyclerview的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView 的简单使用
- Recyclerview的简单使用
- RecyclerView的简单使用
- 在pom.xml中设置maven的镜像为国内镜像
- linux恢复 rm -rf 删除的文件:extundelete
- hbase shell操作之scan+filter
- SharePoint 2016与外部系统人员信息同步(一,Excel数据导入到AD)
- 自建hashMap缓存
- RecyclerView简单的使用
- 关于python的编码问题
- javascript面向对象
- 四大组件之Activity
- Ubuntu下使用Requests 和 lxml抓取个人主页文章
- leetcode 434- Number of Segments in a String
- myeclipse如何安装SVN插件
- plsql中Rowid的用法
- mint-ui —— picker的使用