RecyclerView是Android5.0退出的,它的功能十分的强大,可以用来代替ListView和GridView,而且还能实现瀑布流的布局,更加高级和灵活,提供更为高效的回收复用机制,同时实现管理与视图的解耦和。
RecyclerView属于新增的控件,Android将Recycler定义子啊Support库中,使用时必须在build.gradle(APP)中添加对应的依赖库。
implementation 'com.android.support:recyclerview-v7:28.0.0'
无论是ListView、GridView还是瀑布流它们都是由一个个子元素组成的。所以这里需要设置Item的布局。
和其他组件相同,RecyclerView也需要设置布局,在Recycler中通过setLayoutManager()
来设置布局。RecyclerView提供了三种默认的布局管理(如果这三种布局管理器不能满足开发的要求,也可以自己重写布局方法):
setAdapter()
用来设置适配器
public class RecyclerListAdapter extends Adapter
public class MyViewHolder extends RecyclerView.ViewHolder
{
//初始化Item中的控件
ItemDate itemDate=new ItemDate();
public MyViewHolder(@NonNull View itemView) {
super(itemView);
itemDate.linearLayout=itemView.findViewById(R.id.listViewLinear);
itemDate.imageView=itemView.findViewById(R.id.listViewImage);
itemDate.textView1=itemView.findViewById(R.id.listViewTextView1);
itemDate.textView2=itemView.findViewById(R.id.listViewTextView2);
itemDate.textView3=itemView.findViewById(R.id.listViewTextView3);
}
}
onCreateViewHolder() 创建继承了RecyclerView.Holder的内部类
onBindViewHolder() 绑定数据
getItemCount() 返回Item的数量
public class RecyclerListAdapter extends Adapter {
@NonNull
private Context m_Context;
private List m_ItemList;
private View inflater;
//通过构造函数将上下文和数据传递过来
public RecyclerListAdapter(Context context, List itemList)
{
this.m_Context=context;
this.m_ItemList=itemList;
}
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
inflater=LayoutInflater.from(m_Context).inflate(R.layout.recycle_linear_item_layout,parent,false);
return new MyViewHolder(inflater);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
//绑定数据和控件
holder.itemDate.imageView.setImageResource(m_ItemList.get(position).imageView);
holder.itemDate.textView1.setText(m_ItemList.get(position).textView1);
holder.itemDate.textView2.setText(m_ItemList.get(position).textView2);
holder.itemDate.textView3.setText(m_ItemList.get(position).textView3);
/*RecylcerView不能直接设置点击事件,当需要点击事件时需要自己去实现:
(1)在Adapter里面直接对控件设置点击事件
(2)写接口,在Activity或Ftagment上实现接口中定义的方法
*/
holder.itemDate.linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(m_Context,"第"+position+"被点击",Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
//该返回值时指界面上有多少行
return m_ItemList.size();
}
static private class ItemDate{
public LinearLayout linearLayout;
public ImageView imageView;
public TextView textView1,textView2,textView3;
}
public class MyViewHolder extends RecyclerView.ViewHolder
{
//初始化Item中的控件
ItemDate itemDate=new ItemDate();
public MyViewHolder(@NonNull View itemView) {
super(itemView);
itemDate.linearLayout=itemView.findViewById(R.id.listViewLinear);
itemDate.imageView=itemView.findViewById(R.id.listViewImage);
itemDate.textView1=itemView.findViewById(R.id.listViewTextView1);
itemDate.textView2=itemView.findViewById(R.id.listViewTextView2);
itemDate.textView3=itemView.findViewById(R.id.listViewTextView3);
}
}
}
public class ListViewActivity extends AppCompatActivity {
private RecyclerView m_ListRecycler;
private List DateList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
DateList=new ArrayList<>();
try {
CreateItemList();
m_ListRecycler=findViewById(R.id.listViewTest);
//设置布局管理器
m_ListRecycler.setLayoutManager(new LinearLayoutManager(ListViewActivity.this));
//设置Adapter
m_ListRecycler.setAdapter(new RecyclerListAdapter(ListViewActivity.this,DateList));
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(ListViewActivity.this,"程序发生异常",Toast.LENGTH_SHORT).show();
}
}
private void CreateItemList()
{
DateList.add(new ItemDate(R.drawable.gg_bond,"GGBond","何必呢?何必逼我出手呢!","棒棒糖"));
DateList.add(new ItemDate(R.drawable.chaorenqiang,"超人强","生命是用来浪费在路上的,才华是用来挥霍的","棒棒糖"));
DateList.add(new ItemDate(R.drawable.feifei_princess,"菲菲公主","小猪猪,你没事吧","棒棒糖"));
DateList.add(new ItemDate(R.drawable.mihu_doctor,"迷糊博士","乌鸦复活,那叫尸变;凤凰重生,那叫涅盘!","棒棒糖"));
DateList.add(new ItemDate(R.drawable.poby,"波比","虽然我长的帅,但你也不能对帅哥有这么大的偏见呀!","棒棒糖"));
DateList.add(new ItemDate(R.drawable.xiaodaidai,"小呆呆","想想人都会死的,骂人都觉得没意思了","棒棒糖"));
}
public class ItemDate
{
ItemDate(int imageResource,String userName,String signature,String snack)
{
imageView=imageResource;
textView1=userName;
textView2=signature;
textView3="最喜欢的零食:"+snack;
}
//定义数据结构
public int imageView;
public String textView1,textView2,textView3;
}
}