ecyclerview
1.Recyclerview比listview的优势:
2.Recyclerview支持多布局
3.RecycleView根据需要的插架
1.代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".day00000007.Main5Activity" android:orientation="vertical"> <Button android:text="网格" android:onClick="wang" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:text="线性" android:onClick="xian" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:onClick="pu" android:text="瀑布" android:layout_width="match_parent" android:layout_height="wrap_content" /> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/main_RV"/> </LinearLayout>
//java代码
package com.example.administrator.myapplication.day00000007; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import com.example.administrator.myapplication.R; import java.util.ArrayList; public class Main5Activity extends AppCompatActivity { private RecyclerView rv; private ArrayList<Student> list=new ArrayList<>(); private MainAdapter mainApter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main5); rv=findViewById(R.id.main_RV); list.add(new Student(R.mipmap.qwjpeg,"见风使舵")); list.add(new Student(R.mipmap.c1,"二恶烷")); list.add(new Student(R.mipmap.c4,"最幸福")); list.add(new Student(R.mipmap.c22,"一会卡洛斯")); list.add(new Student(R.mipmap.c4,"见风使舵")); list.add(new Student(R.mipmap.c1,"二恶烷")); list.add(new Student(R.mipmap.c1,"最幸福")); list.add(new Student(R.mipmap.c1,"一会卡洛斯")); list.add(new Student(R.mipmap.cc1,"见风使舵")); list.add(new Student(R.mipmap.cc1,"二恶烷")); list.add(new Student(R.mipmap.cc3,"最幸福")); list.add(new Student(R.mipmap.c4,"一会卡洛斯")); list.add(new Student(R.mipmap.c1,"见风使舵")); list.add(new Student(R.mipmap.qwjpeg,"二恶烷")); DefaultItemAnimator defaultItemAnimator=new DefaultItemAnimator(); defaultItemAnimator.setRemoveDuration(2000); defaultItemAnimator.setAddDuration(2000); rv.setItemAnimator(defaultItemAnimator); DividerItemDecoration dividerItemDecoration=new DividerItemDecoration(Main5Activity.this,DividerItemDecoration.VERTICAL); rv.addItemDecoration(dividerItemDecoration); mainApter=new MainAdapter(list,Main5Activity.this); rv.setAdapter(mainApter); } public void wang(View view) { GridLayoutManager gridLayoutManager=new GridLayoutManager(Main5Activity.this,2); rv.setLayoutManager(gridLayoutManager); } public void xian(View view) { LinearLayoutManager linearLayoutManager=new LinearLayoutManager(Main5Activity.this); rv.setLayoutManager(linearLayoutManager); } public void pu(View view) { StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); rv.setLayoutManager(staggeredGridLayoutManager); } }
//适配器
package com.example.administrator.myapplication.day00000007; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.bumptech.glide.request.RequestOptions; import com.example.administrator.myapplication.R; import java.util.ArrayList; public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> { private ArrayList<Student> list; private Context context; public MainAdapter(ArrayList<Student> list, Context context) { this.list = list; this.context = context; } @NonNull @Override public MainViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view= LayoutInflater.from(context).inflate(R.layout.tab4,null); return new MainViewHolder(view); } @Override public void onBindViewHolder(@NonNull final MainViewHolder mainViewHolder, final int i) { mainViewHolder.ivv.setImageResource(list.get(i).getSrc()); mainViewHolder.tvvv.setText(list.get(i).getTitle()); mainViewHolder.ivv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, "被点击了", Toast.LENGTH_SHORT).show(); list.remove(i); notifyItemRemoved(i); notifyItemChanged(0,list.size()); } }); } @Override public int getItemCount() { return list.size(); } class MainViewHolder extends RecyclerView.ViewHolder{ private ImageView ivv; private TextView tvvv; public MainViewHolder(@NonNull View itemView) { super(itemView); this.ivv=itemView.findViewById(R.id.ivv); this.tvvv=itemView.findViewById(R.id.tvvv); ViewGroup.LayoutParams layoutParams=ivv.getLayoutParams(); layoutParams.height=(int)(Math.random()*200+300); ivv.setLayoutParams(layoutParams); } } }
//item布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:layout_margin="10dp" android:scaleType="centerCrop" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/ivv"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tvvv"/> </LinearLayout>
//实体类
package com.example.administrator.myapplication.day00000007; import android.widget.TextView; class Student { private int src; private String title; public Student(int src, String title) { this.src = src; this.title = title; } public int getSrc() { return src; } public String getTitle() { return title; } public void setSrc(int src) { this.src = src; } @Override public String toString() { return "student{" + "src=" + src + ", title='" + title + '\'' + '}'; } public void setTitle(String title) { this.title = title; } }
//运行效果
1.网格
2.线性布局
3.瀑布流
*******多布局
- RecyclerView.ViewHolder:由于进行多布局操作
- 需要多个ViewHolder对象对应过个xml布局
- 自定义ViewHolder父类
- 1.布局
-
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_weight="8" android:layout_width="match_parent" android:layout_height="0dp"></android.support.v7.widget.RecyclerView> <Button android:text="发送" android:id="@+id/bt_send" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp" /> </LinearLayout>
- 2.java代码
-
package com.example.administrator.myapplication2; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Button; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; QQAdapter qqAdapter; ArrayList<Message> list=new ArrayList<>(); Button button; LinearLayoutManager linearLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView=findViewById(R.id.rv); button=findViewById(R.id.bt_send); list.add(new Message("周星驰",0)); list.add(new Message("nihaof",1)); list.add(new Message("nihaoma",0)); list.add(new Message("nihaoma",0)); list.add(new Message("nihaod",1)); qqAdapter=new QQAdapter(list,MainActivity.this); recyclerView.setAdapter(qqAdapter); linearLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(linearLayoutManager); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { list.add(new Message("你挣好时代DJ",1)); qqAdapter.notifyDataSetChanged(); linearLayoutManager.scrollToPosition(list.size()-1); } }); } }
- //适配器代码
-
package com.example.administrator.myapplication2; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; public class QQAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { ArrayList<Message> list; Context context; public QQAdapter(ArrayList<Message> list, Context context) { this.list = list; this.context = context; } //TODO 根据下标 返回类型 @Override public int getItemViewType(int position) { return list.get(position).getType(); } //TODO 创建ViewHolder @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { if(i==0){ View view = LayoutInflater.from(context).inflate(R.layout.qq_left, viewGroup, false); return new LeftViewHolder(view); }else if(i==1){ View view = LayoutInflater.from(context).inflate(R.layout.qq_right, viewGroup, false); return new RightViewHolder(view); } return null; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { if(getItemViewType(i)==0){ LeftViewHolder leftViewHolder= (LeftViewHolder) viewHolder; leftViewHolder.textView.setText(list.get(i).getMessage()); }else if(getItemViewType(i)==1){ RightViewHolder rightViewHolder= (RightViewHolder) viewHolder; rightViewHolder.textView.setText(list.get(i).getMessage()); } } @Override public int getItemCount() { return list.size(); } class LeftViewHolder extends RecyclerView.ViewHolder{ TextView textView; public LeftViewHolder(@NonNull View itemView) { super(itemView); textView=itemView.findViewById(R.id.tv_left); } } class RightViewHolder extends RecyclerView.ViewHolder{ TextView textView; public RightViewHolder(@NonNull View itemView) { super(itemView); textView=itemView.findViewById(R.id.tv_right); } } }
- //左布局
-
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:src="@mipmap/a1" android:id="@+id/iv_left" android:layout_width="50dp" android:layout_height="50dp" /> <TextView android:id="@+id/tv_left" android:layout_marginTop="40dp" android:text="哈哈哈哈" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
- //右布局
-
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:src="@mipmap/a2" android:layout_alignParentRight="true" android:id="@+id/iv_right" android:layout_width="50dp" android:layout_height="50dp" /> <TextView android:id="@+id/tv_right" android:layout_marginTop="40dp" android:text="哈哈哈哈" android:layout_toLeftOf="@+id/iv_right" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
- //实体类
-
package com.example.administrator.myapplication2; class Message { String message;//消息 int type;//类型 0或者1 0代表左 1代表右 public Message(String message, int type) { this.message = message; this.type = type; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public int getType() { return type; } public void setType(int type) { this.type = type; } }
- //效果图