一、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应该预留的额外空间(显示范围之外,应该额外缓存的空间))。
-
LinearLayoutManager linearLayoutManager =newLinearLayoutManager(this){
@Override
protectedint getExtraLayoutSpace(RecyclerView.State state){
return300;
}
};具体步骤
//创建默认的线性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();
}
});
staticclass rlAdapter extendsRecyclerView.Adapter<RlViewHolder>implementsView.OnClickListener{ //定义接口,处理Item的点击事件
publicstaticinterfaceOnRcvItemClickListener{
void onItemClick(View view,int position);
}
privateOnRcvItemClickListener itemClickListener ;
publicvoid setOnItemClickListener(OnRcvItemClickListener itemClickListener){
this.itemClickListener = itemClickListener;
}
@Override
publicRlViewHolder onCreateViewHolder(ViewGroup viewGroup,int i){
View view =View.inflate(viewGroup.getContext(),R.layout.item_listview,null);
view.setOnClickListener(this);
returnnewRlViewHolder(view);
} @Override
publicvoid onBindViewHolder(RlViewHolder rlViewHolder,int position){
rlViewHolder.iv.setImageResource(arrs[position%5]);
rlViewHolder.tv.setText("测试:"+position%5);
//将数据保存到itemView中
rlViewHolder.itemView.setTag(position);
}
@Override
publicint getItemCount(){
return100;
} @Override
publicvoid onClick(View v){
if(itemClickListener !=null){
itemClickListener.onItemClick(v,(Integer) v.getTag());
}
}
} staticclassRlViewHolderextendsRecyclerView.ViewHolder{
ImageView iv;
TextView tv; publicRlViewHolder(View itemView){
super(itemView);
iv =(ImageView) itemView.findViewById(R.id.iv);
tv =(TextView) itemView.findViewById(R.id.tv);
}
}
二、CardView
CardView继承自FrameLayout类,可以包含圆角和阴影。
通过使用android:elevation属性,创建一个阴影的卡片
1、xml中使用android:cardCornerRadius属性指定圆角半径
2、代码中使用CardView.setRadius 设置圆角半径
3、使用 android:cardBackgroundColor属性设置卡片颜色
4、代码中使用CardView.setBackgroundColor设置卡片颜色,可能会影响卡片的阴影