RecyclerView 的使用
来源:互联网 发布:unity3d前景怎么样 编辑:程序博客网 时间:2024/05/31 00:40
RecyclerView在android5.0之后被引进,可以通过导入support-v7对其进行使用。
据官方的介绍,该控件用于在有限的窗口中展示大量数据集。提供了一种插拔式的体验,高度的解耦,异常的灵活,
通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
• 你想要控制其显示的方式,请通过布局管理器LayoutManager
• 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
• 你想要控制Item增删的动画,请通过ItemAnimator
据官方的介绍,该控件用于在有限的窗口中展示大量数据集。提供了一种插拔式的体验,高度的解耦,异常的灵活,
通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
• 你想要控制其显示的方式,请通过布局管理器LayoutManager
• 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
• 你想要控制Item增删的动画,请通过ItemAnimator
• 你想要控制点击、长按事件,请自己写
1 .RecyclerView的基本展示
public class RecycleerActivity01 extends AppCompatActivity { private RecyclerView recyclerView; private List<String> mdatas; private BasicAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycleer01); recyclerView = (RecyclerView) findViewById(R.id.id_rv); //数据源 initData(); //想recycleView中添加数据,使用适配器 adapter = new BasicAdapter(mdatas, this); recyclerView.setAdapter(adapter); //声明布局管理器,设置RecycleView最终展示的效果,最后一个参数是是否反转数据 LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); //设置增加条目的动画 recyclerView.setItemAnimator(new DefaultItemAnimator()); adapter.setOnItemClickListener(new BasicAdapter.OnItemClickListener1() { @Override public void onItemClick(View itemView, int position) { Toast.makeText(RecycleerActivity01.this, "你点击了" + mdatas.get(position), Toast.LENGTH_SHORT).show(); } @Override public void onLongItemClick(View itemView, int position) { Toast.makeText(RecycleerActivity01.this, "你长按点击了" + mdatas.get(position), Toast.LENGTH_SHORT).show(); } }); } private void initData() { mdatas = new ArrayList<>(); for (int i = 0; i < 48; i++) { mdatas.add("第" + i + "条数据"); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.add: adapter.addData(1); break; case R.id.delete: adapter.removeData(1); case R.id.diplay_lv: LinearLayoutManager manget = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manget); break; case R.id.diplay_gv: GridLayoutManager manage = new GridLayoutManager(this, 3); recyclerView.setLayoutManager(manage); break; case R.id.diplay_hlv: StaggeredGridLayoutManager ma = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL); recyclerView.setLayoutManager(ma); break; case R.id.diplay_hgv: StaggeredGridLayoutManager mm = new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.HORIZONTAL); recyclerView.setLayoutManager(mm); break; case R.id.diplay_staggered: Intent intent = new Intent(this, StaggeredActivity.class); startActivity(intent); break; } return super.onOptionsItemSelected(item); }
public class BasicAdapter extends RecyclerView.Adapter<BasicAdapter.BasicViewHolder> { private List<String> mdatas; private Context context; private OnItemClickListener1 listener;//使用RecyclerView,你想要控制点击、长按事件,需要自写 public BasicAdapter(List<String> mdatas, Context context) { this.mdatas = mdatas; this.context = context; } public void setOnItemClickListener(OnItemClickListener1 listener) { this.listener = listener; } public interface OnItemClickListener1 { public void onItemClick(View itemView, int position); public void onLongItemClick(View itemView, int position); } //创建一个viewholder 并且返回出去 @Override public BasicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(context).inflate(R.layout.item_recycle01, parent, false); BasicViewHolder holder = new BasicViewHolder(itemView); return holder; } //绑定viewholder 在这个方法中,完成赋值操作 @Override public void onBindViewHolder(BasicViewHolder holder, int position) { holder.tv.setText(mdatas.get(position)); setUpEvent(holder); } protected void setUpEvent(final BasicViewHolder holder) { if (listener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int pos = holder.getLayoutPosition(); listener.onItemClick(holder.itemView, pos); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int position = holder.getLayoutPosition(); listener.onLongItemClick(holder.itemView, position); return false; } }); } } public void addData(int pos) { mdatas.add(pos, "insert one"); notifyItemChanged(pos); } public void removeData(int pos) { mdatas.remove(pos); notifyItemRemoved(pos); } @Override public int getItemCount() { return mdatas.size(); } class BasicViewHolder extends RecyclerView.ViewHolder { TextView tv; public BasicViewHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.id_tv1); } }}
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/add" android:icon="@android:drawable/ic_menu_add" android:orderInCategory="100" android:title="add" app:showAsAction="always"></item> <item android:id="@+id/delete" android:icon="@android:drawable/ic_menu_delete" android:orderInCategory="100" android:title="remove" app:showAsAction="always"></item> <item android:id="@+id/comment" android:orderInCategory="100" android:title="展示类型" app:showAsAction="always"> <menu> <item android:id="@+id/diplay_lv" android:orderInCategory="100" android:title="just like ListView"></item> <item android:id="@+id/diplay_gv" android:orderInCategory="100" android:title="just like GridView"></item> <item android:id="@+id/diplay_hlv" android:orderInCategory="100" android:title="Horizontal ListView"></item> <item android:id="@+id/diplay_hgv" android:orderInCategory="100" android:title="Horizontal GridView"></item> <item android:id="@+id/diplay_staggered" android:orderInCategory="100" android:title="Staggered View"></item> </menu> </item></menu>
<android.support.v7.widget.RecyclerView android:id="@+id/id_rv" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView>
2.RecyclerView的切换展示
public class RecycleerActivity02 extends AppCompatActivity { private String url = "http://appsrv.flyxer.com/api/digest/recomm/dests?page=1"; private RecyclerView recyclerView; private listAdapter adapter; private GridAdapter gridAdapter; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycleer01); recyclerView = (RecyclerView) findViewById(R.id.id_rv); context = this; loadData(url); } private void loadData(String url) { RequestParams params = new RequestParams(url); x.http().get(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { List<ParseRootData.RootData> rootbean = ParseRootData.parseData(result); adapter = new listAdapter(context, rootbean); gridAdapter = new GridAdapter(context, rootbean); recyclerView.setAdapter(adapter); LinearLayoutManager manager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manager); } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.country, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.list: recyclerView.setAdapter(adapter); LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manager); break; case R.id.grid: recyclerView.setAdapter(gridAdapter); GridLayoutManager man = new GridLayoutManager(this, 2); recyclerView.setLayoutManager(man); break; } return super.onOptionsItemSelected(item); }}
3 .RecyclerView的照片墙展示 瀑布流,高度不同
public class RecycleerActivity03 extends AppCompatActivity { private RecyclerView recyclerView; private PhotoWallAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycleer01); recyclerView = (RecyclerView) findViewById(R.id.id_rv); adapter = new PhotoWallAdapter(RecycleerActivity03.this); recyclerView.setAdapter(adapter); StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(manager); }}
public class PhotoWallAdapter extends RecyclerView.Adapter<PhotoWallAdapter.PhotoViewHolder> { private Context context; private List<Integer> mHeight; private String imgUrls[]; public PhotoWallAdapter(Context context) { this.context = context; imgUrls = ImageUrls.imageurls; mHeight = new ArrayList<>(); for (int i = 0; i < imgUrls.length; i++) { mHeight.add((int)(300+Math.random()*400)); } } @Override public PhotoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(context).inflate(R.layout.item_stagger,parent,false); PhotoViewHolder holder = new PhotoViewHolder(itemView); return holder; } @Override public void onBindViewHolder(PhotoViewHolder holder, int position) { ViewGroup.LayoutParams lp = holder.iv.getLayoutParams(); lp.height = mHeight.get(position); holder.iv.setLayoutParams(lp); ImageOptions options = new ImageOptions.Builder().setFailureDrawableId(R.mipmap.ic_launcher) .setLoadingDrawableId(R.mipmap.ic_launcher).build(); x.image().bind(holder.iv,imgUrls[position],options); } @Override public int getItemCount() { return imgUrls.length; } class PhotoViewHolder extends RecyclerView.ViewHolder{ ImageView iv; public PhotoViewHolder(View itemView) { super(itemView); iv = (ImageView)itemView.findViewById(R.id.id_iv); } }}
4.RecyclerView的本地数据分页加载 含下拉刷新和上拉加载
public class RecycleerActivity04 extends AppCompatActivity { private RecyclerView recyclerView; private SwipeRefreshLayout swipeRefreshLayout; private List<Map<String, String>> datas; private LinearLayoutManager manager; private RecyclerAdapter4 adapter; private boolean isLoading = false;//判断是否处于上拉加载的状态 private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycleer04); initView(); setEvent(); } private void initView() { recyclerView = (RecyclerView) findViewById(R.id.id_rv); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.sr1); swipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN); manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manager); datas = new ArrayList<>(); getData(); adapter = new RecyclerAdapter4(this, datas); recyclerView.setAdapter(adapter); } private void setEvent() { //设置下拉刷新的操作 swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { handler.postDelayed(new Runnable() { @Override public void run() { datas.clear(); getData(); adapter.notifyDataSetChanged(); swipeRefreshLayout.setRefreshing(false); } }, 3000); } });//设置上拉加载的监听器 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //获得可见条目的最后一条位置 int lastVisibleItemPosition = manager.findLastVisibleItemPosition(); if (lastVisibleItemPosition + 1 == adapter.getItemCount()) { boolean isRefresh = swipeRefreshLayout.isRefreshing(); if (isRefresh) { return; } if (!isLoading) { isLoading = true; //没有处于加载状态,需要加载数据,就可以进行分页加载 handler.postDelayed(new Runnable() { @Override public void run() { getData(); adapter.notifyDataSetChanged(); adapter.notifyItemRemoved(adapter.getItemCount()); isLoading = false; } }, 4000); } } } }); } private void getData() { int size = datas.size(); for (int i = 0; i < 20; i++) { Map<String, String> map = new HashMap<>(); map.put("title", "title======" + (i + size)); map.put("summary", "summary----" + (i + size)); datas.add(map); } }}
public class RecyclerAdapter4 extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<Map<String, String>> mDatas; private final int TYPE_COMMON = 0; private final int TYPE_FOOTER = 1; public RecyclerAdapter4(Context context, List<Map<String, String>> mDatas) { this.context = context; this.mDatas = mDatas; } /** * 获得指定的位置上的显示类型 */ @Override public int getItemViewType(int position) { if (position == getItemCount() - 1) { return TYPE_FOOTER; } return TYPE_COMMON; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_COMMON) { View itemView = LayoutInflater.from(context).inflate(R.layout.item_recycler04, parent, false); ItemViewHolder itemViewHolder = new ItemViewHolder(itemView); return itemViewHolder; } else { View footerView = LayoutInflater.from(context).inflate(R.layout.item_footer, parent, false); FooterViewHolder holder = new FooterViewHolder(footerView); return holder; } } @Override public int getItemCount() { return mDatas.size() == 0 ? 0 : mDatas.size() + 1; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ItemViewHolder) { ((ItemViewHolder) holder).tv_name.setText(mDatas.get(position).get("title")); ((ItemViewHolder) holder).tv_summary.setText(mDatas.get(position).get("summary")); } } class ItemViewHolder extends RecyclerView.ViewHolder { TextView tv_name, tv_summary; public ItemViewHolder(View itemView) { super(itemView); tv_name = (TextView) itemView.findViewById(R.id.tv_name); tv_summary = (TextView) itemView.findViewById(R.id.tv_summary); } } class FooterViewHolder extends RecyclerView.ViewHolder { public FooterViewHolder(View itemView) { super(itemView); } }}
5. RecyclerView的网络 数据分页加载
public class RecycleerActivity05 extends AppCompatActivity { private String url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page="; private int page = 1; private RecyclerView mRecyclerView; private SwipeRefreshLayout swipeRefreshLayout; private List<ParseFoodData.Food> mDatas; private LinearLayoutManager manager; private FoodAdapter adapter; private boolean isLoading = false; Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycleer04); initView(); loadData(url, 1); setEvent(); } private void initView() { mRecyclerView = (RecyclerView) findViewById(R.id.id_rv); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.sr1); swipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN); manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(manager); mDatas = new ArrayList<>(); adapter = new FoodAdapter(this, mDatas); mRecyclerView.setAdapter(adapter); } private void loadData(String url, int index) { RequestParams params = new RequestParams(url + index); x.http().get(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { List<ParseFoodData.Food> list = ParseFoodData.parseData(result); if (list != null && list.size() != 0) { mDatas.addAll(list); page++; adapter.notifyDataSetChanged(); isLoading = false; } else { adapter.notifyItemRemoved(adapter.getItemCount()); } } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); } private void setEvent() { swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { handler.postDelayed(new Runnable() { @Override public void run() { swipeRefreshLayout.setRefreshing(false); } }, 2000); } }); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int lastPos = manager.findLastVisibleItemPosition(); if (lastPos + 1 == adapter.getItemCount()) { if (swipeRefreshLayout.isRefreshing()) { return; } if (!isLoading) { isLoading = true; loadData(url, page); } } } }); }}
public class FoodAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<ParseFoodData.Food> datas; private final int TYPE_COMMON = 0; private final int TYPE_FOOTER = 1; public FoodAdapter(Context context, List<ParseFoodData.Food> datas) { this.context = context; this.datas = datas; } /** * 获得指定的位置上的显示类型 * */ @Override public int getItemViewType(int position) { if (position == getItemCount() - 1) { return TYPE_FOOTER; } return TYPE_COMMON; } //创建viewholder的方法,可以通过判断viewType,创建不同位置的不同布局 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_COMMON) { View itemview = LayoutInflater.from(context).inflate(R.layout.item_list, parent, false); ItemViewHolder itemViewHolder = new ItemViewHolder(itemview); return itemViewHolder; } else { View footView = LayoutInflater.from(context).inflate(R.layout.item_footer, parent, false); FooterViewHolder holder = new FooterViewHolder(footView); return holder; } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ItemViewHolder){ ((ItemViewHolder)holder).tv_name.setText(datas.get(position).getTitle()); ((ItemViewHolder)holder).tv_summary.setText("材料:"+datas.get(position).getFood_str()); ViewGroup.LayoutParams lp = ((ItemViewHolder) holder).icon.getLayoutParams(); lp.height =200; lp.width=300; ((ItemViewHolder) holder).icon.setLayoutParams(lp); ImageOptions options = new ImageOptions.Builder().setLoadingDrawableId(R.mipmap.ic_launcher) .setFailureDrawableId(R.mipmap.ic_launcher).build(); x.image().bind(((ItemViewHolder) holder).icon,datas.get(position).getPic(),options); } } //获取数据的数量 @Override public int getItemCount() { return datas.size() == 0 ? 0 : datas.size() + 1; } class ItemViewHolder extends RecyclerView.ViewHolder { TextView tv_name, tv_summary; ImageView icon; public ItemViewHolder(View itemView) { super(itemView); tv_name = (TextView) itemView.findViewById(R.id.tv_name); tv_summary = (TextView) itemView.findViewById(R.id.tv_summary); icon = (ImageView) itemView.findViewById(R.id.icon); } } class FooterViewHolder extends RecyclerView.ViewHolder { public FooterViewHolder(View itemView) { super(itemView); } }}
导入的包有 如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.jht.administrator.day05.RecycleerActivity04"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/sr1" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/id_rv" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout></RelativeLayout>
0 0
- RecyclerView+RecyclerView.Adapter+RecyclerView.ViewHolder的使用
- RecyclerView的使用
- RecyclerView的使用
- RecyclerView 的使用详解
- RecyclerView的基本使用
- RecyclerView的使用
- Android -- RecyclerView的使用
- RecyclerView的使用
- CardView,RecyclerView的使用
- 关于RecyclerView的使用
- RecyclerView的使用
- RecyclerView的使用(一)
- PopupWindow + RecyclerView的使用
- RecyclerView的简单使用
- RecyclerView 的简单使用
- recyclerview的使用
- RecyclerView的使用记录
- Android RecyclerView的使用
- String,StringBuilder和StringBuffer的区别(二)
- HDU2067 小兔的棋盘!!!
- C语言实验——求三个整数的最大值
- SQLite 变长度整型(varint)编码解码方法
- Retrofit用法详解
- RecyclerView 的使用
- HDU2068 RPG 还没做出来!!! 组合数 错排
- 判断一个图是否有环
- 【poj 1636】Prison rearrangement dp
- ios开发跳转到其他view时将当前view释放掉
- 关于linux的基础命令
- HDU2069 暴力水题 硬币方案 不会传说的母函数 需学!!
- String,StringBuilder和StringBuffer的区别(三)
- 树莓派关机重启指令