RecycleView和CardView

一、RecycleView

  1. <android.support.v7.widget.RecyclerView
  2. android:id="@+id/my_recycler_view"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:scrollbars="vertical"/>
三个关键要素
LayoutManager 线性布局(LinearLayoutManager) Gird布局(GridLayoutManager) 瀑布流布局(StaggeredGridLayoutManager)
Adapter RecyclerView.Adapter<T> T为继承ViewHolder的实现类
Dataset RecyclerView.ViewHolder
recyclerView的条目点击事件需要自己写接口去处理。
 
其它补充知识
recycleView有预加载机制(系统只将屏幕可见范围之内的元素保存在内存中),当第一个Item的高度占据了屏幕时,也就是屏幕内此时只有一个Item,那么在加载下一个Item时会出现卡顿现象,因为内存中不存在可利用的Item,需要去新创建一个Item,造成卡顿。
解决办法,若使用的是LinearLayoutManager,只需重写getExtraLayoutSpace()方法(将返回LayoutManager应该预留的额外空间(显示范围之外,应该额外缓存的空间))。
  1. 1 LinearLayoutManager linearLayoutManager =newLinearLayoutManager(this){
    2 @Override
    3 protectedint getExtraLayoutSpace(RecyclerView.State state){
    4 return300;
    5 }
    6 };

    具体步骤

  1. //创建默认的线性LayoutManager
  2. mLayoutManager =newLinearLayoutManager(this);
  3. //设置recycleView的方向为横向
  4. //mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
  5. mRecyclerView.setLayoutManager(mLayoutManager);
  6. //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
  7. mRecyclerView.setHasFixedSize(true);
  8. //创建并设置Adapter
  9. adapter =new rlAdapter();
  10. mRecyclerView.setAdapter(adapter);
  11. //处理条目点击事件
      adapter.setOnItemClickListener(new rlAdapter.OnRcvItemClickListener(){
@Override
publicvoid onItemClick(View view,int position){
Toast.makeText(MainActivity.this,"当前点击的是第:"+position +"个条目",Toast.LENGTH_SHORT).show();
}
});
 1 staticclass rlAdapter extendsRecyclerView.Adapter<RlViewHolder>implementsView.OnClickListener{
 2 
 3 //定义接口,处理Item的点击事件
 4 publicstaticinterfaceOnRcvItemClickListener{
 5 void onItemClick(View view,int position);
 6 }
 7 privateOnRcvItemClickListener itemClickListener ;
 8 publicvoid setOnItemClickListener(OnRcvItemClickListener itemClickListener){
 9 this.itemClickListener = itemClickListener;
10 }
11 @Override
12 publicRlViewHolder onCreateViewHolder(ViewGroup viewGroup,int i){
13 View view =View.inflate(viewGroup.getContext(),R.layout.item_listview,null);
14  view.setOnClickListener(this);
15 returnnewRlViewHolder(view);
16 }
17 
18 @Override
19 publicvoid onBindViewHolder(RlViewHolder rlViewHolder,int position){
20  rlViewHolder.iv.setImageResource(arrs[position%5]);
21  rlViewHolder.tv.setText("测试:"+position%5);
22 //将数据保存到itemView中
23 rlViewHolder.itemView.setTag(position);
24 }
25 @Override
26 publicint getItemCount(){
27 return100;
28 }
29 
30 @Override
31 publicvoid onClick(View v){
32 if(itemClickListener !=null){
33  itemClickListener.onItemClick(v,(Integer) v.getTag());
34 }
35 }
36 }
37 
38 staticclassRlViewHolderextendsRecyclerView.ViewHolder{
39 ImageView iv;
40 TextView tv;
41 
42 publicRlViewHolder(View itemView){
43 super(itemView);
44  iv =(ImageView) itemView.findViewById(R.id.iv);
45  tv =(TextView) itemView.findViewById(R.id.tv);
46 }
47 }

 

二、CardView

CardView继承自FrameLayout类,可以包含圆角和阴影。
通过使用android:elevation属性,创建一个阴影的卡片

1、xml中使用android:cardCornerRadius属性指定圆角半径

2、代码中使用CardView.setRadius 设置圆角半径

3、使用 android:cardBackgroundColor属性设置卡片颜色

4、代码中使用CardView.setBackgroundColor设置卡片颜色,可能会影响卡片的阴影

 

posted @ 2015-11-26 15:33  cczheng  阅读(478)  评论(0编辑  收藏  举报