Recyclerview
recyclerview比listview的优点
RecyclerView比listview实现效果更多
RecyclerView根据项目需要插拔功能
RecyclerView默认不支持点击事件->程序员代码中通过回调接口的方式添加监听
一.效果:线性/网格/瀑布流
二.重要的方法
1.RecyclerView横向滑动:
LinearLayoutManager.HORIZONTAL横向滑动LinearLayoutManager.VERTICAL垂直滑动
2.RecyclerView.Adapter中刷新方法区别:
notifyDataSetChanged();整体刷新+没有动画效果
notifyItemInserted(int position,Object data):有动画效果+添加一条数据在position位置
notifyItemRemoved(position);有动画效果+删除一条数据并刷新
注意:当添加和删除的时候,要更新下标,不然有错位现象
3.RecyclerView多布局展示:
public int getItemViewType(int position)返回当前数据的itemview类型
4.RecyclerView常见方法:
LinearLayoutManager:recyclerview线性管理器(垂直水平方向);
GridLayoutManager:网格布局管理器;
StaggeredGridLayoutManager:瀑布流布局管理器;
RecyclerView.setLayoutManager(LayoutManager manager):添加布局管理器
RecyclerView.addItemDecoration(ItemDecoration decoration):添加分割线
RecyclerView.setItemAnimator(ItemAnimator animator):添加动画方法
RecyclerView.setAdapter(Adapter adapter):添加适配器
三.RecyclerView的使用
implementation 'com.android.support:recyclerview-v7:28.0.0‘ 导入依赖
四.代码
布局activity_main.xml:
<android.support.v7.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
(2)Java代码:MainActivity.java
package com.example.kuaishou;
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.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements com.example.kuaishou.base.MainItemClickLisener, com.example.kuaishou.base.MainItemLongClickLisener {
RecyclerView recyclerView;
base base;
ArrayList<Student> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recy);
EventBus.getDefault().register(this);
new Threads().start();
base = new base(MainActivity.this, list);
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.xian));
DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
defaultItemAnimator.setRemoveDuration(1000);
defaultItemAnimator.setAddDuration(1000);
recyclerView.setItemAnimator(defaultItemAnimator);
base.setMainItemClickLisener(this);
base.setMainItemLongClickLisener(this);
recyclerView.setAdapter(base);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void show(String s) throws JSONException {
JSONObject jsonObject = new JSONObject(s);
JSONArray data = jsonObject.getJSONArray("data");
for (int i=0;i<data.length();i++){
JSONObject jsonObject1 = data.getJSONObject(i);
String height = jsonObject1.getString("height");
String width = jsonObject1.getString("width");
String cdn_img = jsonObject1.getString("cdn_img");
String love = jsonObject1.getString("love");
Student student = new Student(cdn_img,love,height,width);
Log.e("masdxx",cdn_img);
Log.e("masdxx",love);
list.add(student);
}
base.notifyDataSetChanged();
}
@Override
public void ItemClick(int position) {
Toast.makeText(this, "单击", Toast.LENGTH_SHORT).show();
}
@Override
public void ItemLongClick(int position) {
Toast.makeText(this, "长按", Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
下面还有适配器里的代码
package com.example.kuaishou;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
public class base extends RecyclerView.Adapter<base.MainAdpater> {
MainActivity mainActivity;
ArrayList<Student> list;
public base(MainActivity mainActivity, ArrayList<Student> list) {
this.mainActivity = mainActivity;
this.list = list;
}
@NonNull
@Override
public MainAdpater onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View inflate = LayoutInflater.from(mainActivity).inflate(R.layout.layout, null);
return new MainAdpater(inflate);
}
@Override
public void onBindViewHolder(@NonNull MainAdpater mainAdpater, final int i) {
mainAdpater.textView.setText(list.get(i).getLove());
Glide.with(mainActivity).load(list.get(i).getCdn_img()).into(mainAdpater.imageView);
WindowManager windowManager = mainActivity.getWindowManager();
//获取照片显示时的宽
float width = windowManager.getDefaultDisplay().getWidth()/2;
Log.d("zxh","屏幕宽:"+width);
//获取照片的宽
float wid = Float.parseFloat(list.get(i).getWidth());
Log.d("zxh","照片宽:"+wid);
//获取比例
float kuan = wid/ width;
Log.d("zxh","比例:"+kuan);
//获取照片高
Log.d("xxxxx",list.get(i).getHeight());
float hei = Float.parseFloat(list.get(i).getHeight());
Log.d("zxh","照片高:"+hei);
//获取设置实际照片的高
int gao = (int)(hei/kuan);
Log.d("zxh","实际照片的高:"+gao);
ViewGroup.LayoutParams layoutParams = mainAdpater.imageView.getLayoutParams();
layoutParams.height = gao;
mainAdpater.imageView.setLayoutParams(layoutParams);
Log.d("zxh","----------------------");
mainAdpater.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mainItemClickLisener.ItemClick(i);
}
});
mainAdpater.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mainItemLongClickLisener.ItemLongClick(i);
return true;
}
});
}
@Override
public int getItemCount() {
return list.size();
}
class MainAdpater extends RecyclerView.ViewHolder{
ImageView imageView;
TextView textView;
public MainAdpater(@NonNull View itemView) {
super(itemView);
this.imageView = itemView.findViewById(R.id.a);
this.textView = itemView.findViewById(R.id.aa);
}
}
private MainItemClickLisener mainItemClickLisener;
private MainItemLongClickLisener mainItemLongClickLisener;
public void setMainItemClickLisener(MainItemClickLisener mainItemClickLisener) {
this.mainItemClickLisener = mainItemClickLisener;
}
public void setMainItemLongClickLisener(MainItemLongClickLisener mainItemLongClickLisener) {
this.mainItemLongClickLisener = mainItemLongClickLisener;
}
interface MainItemClickLisener{
void ItemClick(int position);
}
interface MainItemLongClickLisener{
void ItemLongClick(int position);
}
}
多布局实现微信聊天
package com.example.qq;
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;
Button button;
ArrayList<bean> list = new ArrayList<>();
int flag=0;
base base;
LinearLayoutManager linearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.list);
button = findViewById(R.id.but);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
flag++;
if(flag%2==0){
list.add(new bean(0,"你好啊~"));
}else if(flag%2==1){
list.add(new bean(1,"你好啊~"));
}
linearLayoutManager.scrollToPositionWithOffset(list.size()-1,0);
base.notifyDataSetChanged();
}
});
base = new base(list, this);
recyclerView.setAdapter(base);
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
}
}
适配器代码如下
package com.example.qq;
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 base extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
ArrayList<bean> list;
Context context;
public base(ArrayList<bean> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getItemViewType(int position) {
return list.get(position).type;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
if(i==0){
return new zuo(LayoutInflater.from(context).inflate(R.layout.a1,viewGroup,false));
}else{
return new you(LayoutInflater.from(context).inflate(R.layout.a2,viewGroup,false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if(getItemViewType(i)==0){
zuo zuo = (base.zuo) viewHolder;
zuo.textView.setText(list.get(i).getName());
}else{
you you = (base.you) viewHolder;
you.textView.setText(list.get(i).getName());
}
}
@Override
public int getItemCount() {
return list.size();
}
class zuo extends RecyclerView.ViewHolder{
TextView textView;
public zuo(@NonNull View itemView) {
super(itemView);
this.textView=itemView.findViewById(R.id.text);
}
}
class you extends RecyclerView.ViewHolder{
TextView textView;
public you(@NonNull View itemView) {
super(itemView);
this.textView=itemView.findViewById(R.id.text);
}
}
}