1、RecyclerView:5.0之后的控件,扩展优化,吸收了
2、ViewHolder./RecyclerView的adapter与BaseAdapter不同
3、RecyclerView的adapter:只负责创建holder,给holder设置展示的数据。
步骤分析:1、先添加依赖库,File-->project stru-->选中module,Dependes--->加号-->选择recyvlerview的包,添加
创建相关页面Activity--layout:并且实例化相应控件
2、自定义item布局
3、创建实体类
4、搭建数据集:List<实体类>
5、Adapter:ViewHolder:实例化控件
自定义Adapter步骤:
a、先创建一个ViewHolder的内部类MyHolder继承于ViewHolder,在内部类中实例化控件属性
b、让主类RecyclePhoneAdapter继承于RecycleView下的adapter并且给Adapter加上内部类的泛型
主要为了重写3个方法时候不用再强转返回值类型(不设置泛型返回值为父类)
c、新建自定义adapter完成后要在对应主Java代码中( RecyclePhoneAdapter adapter=new RecyclePhoneAdapter(this,list);)使用
并且设置展示样式( //设置布局管理器
rv_phone.setLayoutManager(new LinearLayoutManager(this));//像ListView一样展示
rv_phone.setAdapter(adapter);)
ps; //使用系统自带默认分割线
rv_phone.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));
自定义Adapter代码样例:
/**自定义adapter的作用,创建ViewHolder,给holder设置数据展示
* 继承RecycleView.Adapter<当前类的泛型.MyHolder>,重写里边三个方法
* Created by Administrator on 2017/2/20.
* 步骤:1、先创建一个ViewHolder的内部类MyHolder继承于ViewHolder,在内部类中实例化控件属性
* 2、让主类RecyclePhoneAdapter继承于RecycleView下的adapter并且给Adapter加上内部类的泛型
* 主要为了重写3个方法时候不用再强转返回值类型(不设置泛型返回值为父类)
* 3、新建自定义adapter完成后要在对应主Java代码中( RecyclePhoneAdapter adapter=new RecyclePhoneAdapter(this,list);)使用
* 并且设置展示样式( //设置布局管理器
rv_phone.setLayoutManager(new LinearLayoutManager(this));//像ListView一样展示
rv_phone.setAdapter(adapter);)
ps; //使用系统自带默认分割线
rv_phone.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));
*/
public class RecyclePhoneAdapter extends RecyclerView.Adapter<RecyclePhoneAdapter.MyHolder> implements View.OnClickListener{
private Context pContext;
private List<PhoneEntity> list;
private LayoutInflater inflater;
private OnItemClick ItemClickListener=null;
//给自定义接口一个实例,并提供下边set方法
public void setItemClickListener(OnItemClick itemClickListener) {
ItemClickListener = itemClickListener;
}
//有参的构造函数,并实例化布局加载器
public RecyclePhoneAdapter(Context pContext, List<PhoneEntity> list) {
this.pContext = pContext;
this.list = list;
inflater=LayoutInflater.from(pContext);
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//第二个参数是容器 第三个参数:true使用父布局的布局参数,false使用自己的布局参数
View view=inflater.inflate(R.layout.activity_phone_list,parent,false);//使用自定义布局格式
MyHolder holder=new MyHolder(view);//将自定义的布局传给MyHolder内置处理
holder.itemView.setOnClickListener(this);//为当前item设置点击事件
return new MyHolder(view);
}
@Override
public void onBindViewHolder(MyHolder holder, int position) {
//获取对应位置的数据, 不能再此重新实例化
PhoneEntity phone=list.get(position);
holder.phone_name.setText(phone.getName());
holder.img_phone.setImageResource(phone.getImg());
holder.phone_price.setText(phone.getPrice());
holder.phone_counter.setText(phone.getCountNum());
holder.itemView.setTag(position);//将item位置设置成标签,
}
@Override
public int getItemCount() {
return list.size();
}
//继承自定义接口,重写自定义接口中的方法,给item添加点击事件
@Override
public void onClick(View v) {
//调用自定义接口中的方法,给当前item添加点击事件
if(ItemClickListener!=null){
ItemClickListener.onitemclick(Integer.parseInt(v.getTag().toString()));
}
}
//创建内部类继承于RecycleView.ViewHolder实例化自定义布局中的属性
class MyHolder extends RecyclerView.ViewHolder{
private ImageView img_phone;
private TextView phone_name;
private TextView phone_price;
private TextView phone_counter;
public MyHolder(View itemView) {
super(itemView);
img_phone= (ImageView) itemView.findViewById(R.id.img_phone);
phone_name= (TextView) itemView.findViewById(R.id.phone_name);
phone_price= (TextView) itemView.findViewById(R.id.phone_price);
phone_counter= (TextView) itemView.findViewById(R.id.phone_counter);
}
}
// 自定义接口,通过触发不同位置item的方式,调用接口中的方法,实现点击事件的监听效果
public interface OnItemClick{
void onitemclick(int position);
}