Recyclerview
3种效果:
线性/网格/瀑布流
Recyclerview
RecyclerView比ListView的优势:
1.RecyclerView比listview实现效果更多
2.RecycelrView支持多布局;
3.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):添加适配器
导入依赖
implementation ‘com.android.support:recyclerview-v7:28.0.0’
案例快手
//主类
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
ArrayList<Bean.DataBean> list=new ArrayList<>();
MainAdapter adapter;
@SuppressLint("HandlerLeak")
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==101){
String s=(String)msg.obj;
Gson gson=new Gson();
Bean bean = gson.fromJson(s, Bean.class);
List<Bean.DataBean> data = bean.getData();
list.addAll(data);
adapter=new MainAdapter(list,MainActivity.this);
//线性布局
//final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
// linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//网格布局
// GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
//瀑布流效果
StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
//设置分割线
// DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
// rv.addItemDecoration(dividerItemDecoration);
//设置动画
DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
defaultItemAnimator.setRemoveDuration(2000);//设置延迟2秒删除的效果
defaultItemAnimator.setAddDuration(2000);
recyclerView.setItemAnimator(defaultItemAnimator);
recyclerView.setAdapter(adapter);
//利用接口回调
adapter.setMyOnItemClickListener(new MyOnItemClickListener() {
@Override
public void myonItemClickListener(int position) {
list.remove(position);
adapter.notifyItemRemoved(position);
adapter.notifyItemRangeChanged(0,list.size());
}
});
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.rv);
new MyThread(MainActivity.this).start();
}
}
//适配器类
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
ArrayList<Bean.DataBean> arrayList;
MainActivity context;
MyOnItemClickListener myOnItemClickListener;
public void setMyOnItemClickListener(MyOnItemClickListener myOnItemClickListener) {
this.myOnItemClickListener = myOnItemClickListener;
}
public MainAdapter(ArrayList<Bean.DataBean> arrayList, MainActivity context) {
this.arrayList = arrayList;
this.context = context;
}
@NonNull
@Override
public MainViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = View.inflate(context, R.layout.item_layout, null);
return new MainViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MainViewHolder viewHolder, final int i) {
Glide.with(context).load(arrayList.get(i).getCdn_img()).into(viewHolder.imageView);
Glide.with(context).load(arrayList.get(i).getProfile_image()).apply(RequestOptions.bitmapTransform(new CircleCrop())).into(viewHolder.imageView1);
WindowManager windowManager = context.getWindowManager();
float width = windowManager.getDefaultDisplay().getWidth()/2;
float wid = Float.parseFloat(arrayList.get(i).getWidth());
float bili=wid/width;
float height = Float.parseFloat(arrayList.get(i).getHeight());
float gao=height/bili;
ViewGroup.LayoutParams layoutParams = viewHolder.imageView.getLayoutParams();
layoutParams.height= (int) gao;
viewHolder.imageView.setLayoutParams(layoutParams);
viewHolder.textView.setText("♥:"+arrayList.get(i).getLove());
viewHolder.textView1.setText(arrayList.get(i).getText());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// arrayList.remove(i);
// notifyItemRemoved(i);
// notifyItemRangeChanged(0,arrayList.size());
myOnItemClickListener.myonItemClickListener(i);
}
});
}
@Override
public int getItemCount() {
return arrayList.size();
}
class MainViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
TextView textView;
TextView textView1;
ImageView imageView1;
public MainViewHolder(@NonNull View itemView) {
super(itemView);
this.imageView=itemView.findViewById(R.id.iv);
this.textView=itemView.findViewById(R.id.tv);
this.textView1=itemView.findViewById(R.id.tv1);
this.imageView1=itemView.findViewById(R.id.iv_tou);
}
}
}
//接口
public interface MyOnItemClickListener {
public void myonItemClickListener(int position);
}
//下载串的线程
public class MyThread extends Thread {
MainActivity activity;
public MyThread(MainActivity activity) {
this.activity = activity;
}
@Override
public void run() {
super.run();
try {
URL url=new URL("https://www.apiopen.top/satinApi?type=1&page=2");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
if (urlConnection.getResponseCode()==200){
InputStream inputStream = urlConnection.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
String str=null;
StringBuffer sb=new StringBuffer();
while ((str=br.readLine())!=null){
sb.append(str);
}
String string = sb.toString();
Message message = Message.obtain();
message.what=101;
message.obj=string;
activity.handler.sendMessage(message);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//谷歌插件写Bean类
//行布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:padding="10dp"
android:layout_height="match_parent">
<ImageView android:layout_width="150dp"
android:id="@+id/iv"
android:padding="3dp"
android:scaleType="fitXY"
android:layout_height="wrap_content"/>
<ImageView android:layout_width="50dp"
android:id="@+id/iv_tou"
android:layout_height="50dp"/>
<TextView android:layout_width="100dp"
android:layout_marginLeft="50dp"
android:layout_marginTop="-50dp"
android:id="@+id/tv1"
android:textSize="8dp"
android:layout_height="50dp"/>
<TextView android:layout_width="150dp"
android:id="@+id/tv"
android:gravity="right"
android:layout_height="50dp"/>
</LinearLayout>
//主界面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>