[置顶] RecycleView的基本配置和使用方法(五)--总结
2016-12-12 14:12
567 查看
定义:
从字面意思可以看出recycleview是重视回收和复用view的一个控件。
基本方法介绍
(1)getItemViewType(int position)--根据位置来判定使用哪种类型的View(打造出各种样式的recyclerView的基础); (2)recyclerView.Holder--主要是对findviewbyid的减少使用的优化,这个和listview没什么区别,只是说recyclerview设计到里面,不用自己添加; (3)recycleView.Recycler--回收缓存机制;
item中多布局的使用流程:
(1)有多种布局流程:滚动---getitemVIewType(int offsetposition)--根据type找到Holder----adapter.BindViewHolder; (2)没有多布局的流程:滚动--adapter.creatViewHolder;
说明:
(1)itemType的作用: a、itemType保存在Holder总; b、Holder根据position被缓存到cache中,复用的时候会在cache中拿到Holder; c,遍历cache中的holder,如果Type一致就返回。 (2)recycleView.Holder的作用: a、保存view的单位; b、记录在RecyclerView中的基本信息。 c、是否需要被缓存Tag标志。 (3)recycleview.recycler a、recyclerView中被缓存的Holder 缓存 保存 存放 (内部类) RecyclerView--》holder--》map--》Recycler b.加入使用有多个recyclerView会公用一个RecyclerPool(缓存池)
与listview的区别:
(1)两者没有继承实现等关系,分属于不同的控件体系没有关系; (2)Type已经是Holder的成员; (3)RcyclerView的缓存单位是Holder而不是View; (4)RcycleredPool的缓存Key是Type;
在使用中要注意的重要信息:
1.Item间的动画,间隔的实现 (1)Item的布局,就是使用LayoutManager来设置主要有两种 1.LinearLayout 2.Gridlayout (2)Item间如何分隔---------------------------》通过实现ItemDecoration这个类的子类来实现 (3)Item间的增加和删除动画------------------》通过实现ItemAnimation类的子类 2.recyclerView的作用; (1)可以实现ListView,Gridview (2)横向listView,横向Gridview (3)瀑布流 (4)定制Item的增加和删除的动画
recycleview的优缺点:
(1)优点:可以自定义布局,分割线等等优点 (2)缺点:对于点击,滑动长按等事件的处理没有现成的方法,自能自己重新定义。
基本实践应用:
引用recycleView控件
(1)配置:在Gradle.Scripts中添加‘com.android.support:recyclerview-v7:23.4.0’; (2)导入入android.support.v7.widget.RecyclerView的包; (3)同步网络; (4)在布局中引入recycleview;
实现各种不同的效果:
实现listview效果:
使用的方法: /** *这是ListView的效果 */ recyclerView.setLayoutManager(new LinearLayoutManager(this));
实现GridView的效果:
/** *这是GridView的效果 2指的是列数为2; */ recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
实现瀑布流:
(1)获取item的随机的高度(注意随机数的产生的方法): /** * 得到随机的Item的高度 */ private void getRandomHeight(List<String> list) { height = new ArrayList<>(); for (int i = 0; i < list.size(); ++i) { height.add((int) (200 + Math.random() * 400)); } } (2)重写OnBindViewHolder()方法,获取item的LayoutParams的布局参数,把随机高度赋予item; @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { /** * 得到item的LayoutParams布局参数 */ ViewGroup.LayoutParams params = holder.itemView.getLayoutPar dca8 ams(); params.height = height.get(position);//把随机的高度赋予item布局////// holder.itemView.setLayoutParams(params);//把params设置item布局 (3)使用StaggeredGridLayoutManager(): /** *2,表示两列;VERTICAL表示垂直方向 */ recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
这样就简单的实现了瀑布流;
item的操作应用:
(1)item的增加和删除,主要是适配器中实现:(1)增加: /** *增加Item */ public void addItem(int position) { list.add(position,"A"); notifyItemInserted(position); } (2)删除 /** *删除Item */ public void removeItem(int position) { list.remove(position); notifyItemRemoved(position); }
(2)对item进行操作(以button为操作控件)
@Override public void onClick(View v) { switch (v.getId()) { case R.id.addItem: homeAdapter.addItem(1); break; case R.id.removeItem: homeAdapter.removeItem(1); break;
(3)RecyclerView中item的长按和短按的监听事件(设置接口进行回调)
public interface ItemClickListener { /** * Item的普通点击 */ public void onItemClick(View view, int position); /** * Item长按 */ public void onItemLongClick(View view, int position);
(4)以TextView为例实现点击和长按事件:
//为TextView添加监听回调 holder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (itemClickListener != null) { itemClickListener.onItemSubViewClick(holder.textView, position); } } });
(5)点击和长按的实现方法
//为item添加普通点击回调 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (itemClickListener != null) { itemClickListener.onItemClick(itemView, getPosition()); } } }); //为item添加长按回调 itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (itemClickListener != null) { itemClickListener.onItemLongClick(itemView, getPosition()); } return true; } }); homeAdapter.setItemClickListener(new ItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, "点击了Item" + position, Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(View view, int position) { Toast.makeText(MainActivity.this, "长按了Item" + position, Toast.LENGTH_SHORT).show(); }
recycleView实现的简单效果的代码
这是activity_main 的XML文件<?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" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/addItem" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="增加Item" /> <Button android:id="@+id/removeItem" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="删除Item" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/change_listView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="切换ListView" /> <Button android:id="@+id/change_gridView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="切换GridView" /> <Button android:id="@+id/change_waterfall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="切换瀑布流" /> </LinearLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView_demo" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout>
这是item的XML文件
<?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="wrap_content" android:background="#44ff0000" android:orientation="vertical"> <TextView android:id="@+id/id_num" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="1" /> </LinearLayout>
这是RecyclerView的适配器
import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.example.recycleview.Interfaces.ItemClickListener; import com.example.recycleview.R; import java.util.ArrayList; import java.util.List; /** * Created zhangyunhao on 2016/12/12. * 设置RecyclerView的适配器 */ public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> { private List<String> list; private Context context; private List<Integer> height; private ItemClickListener itemClickListener; public HomeAdapter(Context context, List<String> list) { this.context = context; this.list = list; getRandomHeight(this.list); } public void setItemClickListener(ItemClickListener itemClickListener) { this.itemClickListener = itemClickListener; } /** * 得到随机的Item的高度 */ private void getRandomHeight(List<String> list) { height = new ArrayList<>(); for (int i = 0; i < list.size(); ++i) { height.add((int) (200 + Math.random() * 400)); } } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.recyclerview_item, parent, false)); return holder; } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { /** * 得到item的LayoutParams布局参数 */ ViewGroup.LayoutParams params = holder.itemView.getLayoutParams(); params.height = height.get(position);//把随机的高度赋予item布局 holder.itemView.setLayoutParams(params);//把params设置item布局 holder.textView.setText(list.get(position));//为控件绑定数据 //为TextView添加监听回调 holder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (itemClickListener != null) { itemClickListener.onItemSubViewClick(holder.textView, position); } } }); } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder { TextView textView; public MyViewHolder(final View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.id_num); //为item添加普通点击回调 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (itemClickListener != null) { itemClickListener.onItemClick(itemView, getPosition()); } } }); //为item添加长按回调 itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (itemClickListener != null) { itemClickListener.onItemLongClick(itemView, getPosition()); } return true; } }); } } public void addItem(int position) { list.add(position,"A"); notifyItemInserted(position); } public void removeItem(int position) { list.remove(position); notifyItemRemoved(position); } }
这是MainActivity
import android.support.v7.app.AppCompatActivity; 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.os.Bundle; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.example.recycleview.Adapters.HomeAdapter; import com.example.recycleview.Interfaces.ItemClickListener; import com.example.recycleview.R; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private RecyclerView recyclerView; private List<String> list; private HomeAdapter homeAdapter; private Button addItem; private Button removeItem; private Button change_listView; private Button change_gridView; private Button change_waterfall; private boolean isFirstView = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(); initData(); recyclerView = (RecyclerView) findViewById(R.id.recyclerView_demo); recyclerView.setItemAnimator(new DefaultItemAnimator()); homeAdapter = new HomeAdapter(this, list); recyclerView.setAdapter(homeAdapter); homeAdapter.setItemClickListener(new ItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, "点击了Item" + position, Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(View view, int position) { Toast.makeText(MainActivity.this, "长按了Item" + position, Toast.LENGTH_SHORT).show(); } @Override public void onItemSubViewClick(View view, int position) { } }); } public void findViewById() { addItem = (Button) findViewById(R.id.addItem); removeItem = (Button) findViewById(R.id.removeItem); change_listView = (Button) findViewById(R.id.change_listView); change_gridView = (Button) findViewById(R.id.change_gridView); change_waterfall = (Button) findViewById(R.id.change_waterfall); addItem.setOnClickListener(this); removeItem.setOnClickListener(this); change_listView.setOnClickListener(this); change_gridView.setOnClickListener(this); change_waterfall.setOnClickListener(this); } private void initData() { list = new ArrayList<>(); for (int i = 'A'; i <= 'Z'; ++i) { list.add("" + (char) i); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.addItem: homeAdapter.addItem(1); break; case R.id.removeItem: homeAdapter.removeItem(1); break; case R.id.change_listView: /** * ListView的效果 */ recyclerView.setLayoutManager(new LinearLayoutManager(this)); if (isFirstView) { isFirstView = false; onClick(findViewById(R.id.recyclerView_demo)); } break; case R.id.change_gridView: /** * GridView的效果 */ recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); break; case R.id.change_waterfall: /** * 瀑布流的效果 */ recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); break; default: break; } } }
相关文章推荐
- [置顶] RecycleView的基本配置和使用方法(一)---初识RecycleView
- [置顶] RecycleView的基本配置和使用方法(三)---RecycleView中 item的事件处理
- [置顶] RecycleView的基本配置和使用方法(四)---RecycleView实现简单demo
- [置顶] RecycleView的基本配置和使用方法(二)---RecycleView实践应用
- UITableView 基本使用方法总结
- UITableView 基本使用方法总结
- UITableView 基本使用方法总结
- UITableView 基本使用方法总结
- UITableView 基本使用方法总结
- 转 UITableView 基本使用方法总结
- iOS开发UITableView基本使用方法总结 分类: ios技术 2015-04-03 17:51 68人阅读 评论(0) 收藏
- 【iOS7的一些总结】13、UIScrollView的概念和基本使用方法
- iOS开发UITableView基本使用方法总结
- iOS开发UITableView基本使用方法总结
- UITableView 基本使用方法总结
- UITableView 基本使用方法总结
- UITableView 基本使用方法总结
- UITableView 基本使用方法总结
- UITableView 基本使用方法总结
- UITableView总结:基本使用方法介绍