RecycleView和CardView
一、RecycleView
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
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 LinearLayoutManager linearLayoutManager =newLinearLayoutManager(this){ 2 @Override 3 protectedint getExtraLayoutSpace(RecyclerView.State state){ 4 return300; 5 } 6 };
具体步骤
//创建默认的线性LayoutManager
mLayoutManager =newLinearLayoutManager(this);
//设置recycleView的方向为横向
//mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(mLayoutManager);
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
mRecyclerView.setHasFixedSize(true);
//创建并设置Adapter
adapter =new rlAdapter();
mRecyclerView.setAdapter(adapter);
- //处理条目点击事件
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设置卡片颜色,可能会影响卡片的阴影