RecylerView是类似于ListView、GridView的控件,但是它标准化了ViewHolder,而且比ListView、GridView这些控件更加灵活,并且还能够实现他们不能实现的功能,在布局管理器中可以设置多种格式:1、LinearLayoutManager可以使内容线性排列,横向或纵向,下一个参数是布尔类型的参数。2、GridLayoutManager 是网格式布局管理,第二个参数是int类型的数字,你想让布局显示几列就可以设置成为几,第三个参数可以设置横纵向,第四个参数是布尔类型的参数。3、StaggeredGridLayoutManager 是上面那两个控件不能实现的功能,
他是瀑布流,其参数和网格式布局的参数一样,但显示的效果不一样。但是下面这些涉及到一些其他的内容,ListView多条目展示,还有设置标头。
在MainActivity中
public class MainActivity extends AppCompatActivity {
RecyclerView rv;
List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到RecylerView的控件
rv = (RecyclerView) findViewById(R.id.rv);
//初始化数据
initrv();
}
public void initrv() {
initdata();
//线性布局管理器
LinearLayoutManager manager = new LinearLayoutManager(this);
//关联管理器
rv.setLayoutManager(manager);
//创建RecylerVewde的适配器
MyRVAdapter adapter = new MyRVAdapter();
//实例化一个TextView
TextView tv1=new TextView(this);
//在TextView里设置标题的内容
tv1.setText("标题1");
TextView tv2=new TextView(this);
tv2.setText("标题2");
//在适配器中加入标题
adapter.addheader(tv1);
adapter.addheader(tv2);
//关联适配器
rv.setAdapter(adapter);
}
//初始化条目的数据
private void initdata() {
//实例化字符串集合
list = new ArrayList<String>();
//for循环添加数据
for (int i =0; i <100; i++) {
list.add("Position" + i);
}
}
//创建适配器的类并继承RecylerView的Adapter
class MyRVAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
//设置标头以及多条目的类型
public static final int TYPE_HEADER=0;
public static final int TYPE_ONE=1;
public static final int TYPE_TWO=2;
List<View> listheader=new ArrayList<View>();
//添加标头的方法
public void addheader(View view){
listheader.add(view);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//if else判断类型若如果是标头则添加标头的布局,如果是TYPE_ONE则添加第一个布局,TYPE_TWO则添加第二个布局。
if(viewType==TYPE_HEADER){
View view3 = View.inflate(MainActivity.this, R.layout.rv_header, null);
MyHeaderHolder holderh = new MyHeaderHolder(view3);
return holderh;
}else if (viewType == TYPE_ONE) {
View view = View.inflate(MainActivity.this, R.layout.rv_item, null);
MyViewHolder1 holder1 = new MyViewHolder1(view);
return holder1;
} else{
View view2 = View.inflate(MainActivity.this, R.layout.rv_item2, null);
MyViewHolder2 holder2 = new MyViewHolder2(view2);
return holder2;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//如果子布局的数量为0的话先移除视图再添加视图则能使两个标题顺序不再变化
if (holder instanceof MyHeaderHolder){
if(((MyHeaderHolder)holder).ll.getChildCount()==0){
((MyHeaderHolder)holder).ll.removeView(listheader.get(position));
((MyHeaderHolder)holder).ll.addView(listheader.get(position));
}
}
//给holder的TextView添加文字
if(holder instanceof MyViewHolder1){
((MyViewHolder1) holder).tv.setText(list.get(position));
}
if(holder instanceof MyViewHolder2){
((MyViewHolder2) holder).tv2.setText(list.get(position));
}
}
//如果List为空则返回零,否则返回集合的长度
@Override
public int getItemCount() {
return list==null?0:list.size();
}
//得到条目视图的类型
@Override
public int getItemViewType(int position) {
//如果position小于标头集合的长度则返回标头,如果position比5余0的话则返回TYPE_ONE否则返回TYPE_TWO
if(position < listheader.size()){
return TYPE_HEADER;
}else if(position%5==0){
return TYPE_TWO;
}else {
return TYPE_ONE;
}
}
//下面是各个holder类均继承RecylerView的ViewHolder在他们各自的布局中找到他们的控件
class MyViewHolder1 extends RecyclerView.ViewHolder{
TextView tv;
public MyViewHolder1(View itemView) {
super(itemView);
tv=itemView.findViewById(R.id.tv);
}
}
class MyHeaderHolder extends RecyclerView.ViewHolder{
LinearLayout ll;
public MyHeaderHolder(View itemView) {
super(itemView);
ll=itemView.findViewById(R.id.ll);
}
}
class MyViewHolder2 extends RecyclerView.ViewHolder{
TextView tv2;
ImageView iv;
public MyViewHolder2(View itemView) {
super(itemView);
tv2=itemView.findViewById(R.id.tv2);
iv=itemView.findViewById(R.id.iv);
}
}
}
}