RecyclerView
- 自动复用
- 支持网格布局、线性布局、瀑布流布局
- 支持动画和多布局
- 支持自定义分割线
基本使用
效果图
效果图.gif
MainActivity类
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import com.alibaba.fastjson.JSON;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private RecyclerView rv_food;
private List<FoodBean.DataBean> list = new ArrayList<>();
private Button line;
private Button grid;
private Button falls;
private LinearLayoutManager linearLayoutManager;
private GridLayoutManager gridLayoutManager;
private StaggeredGridLayoutManager staggeredGridLayoutManager;
private MyRecyclerViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
//网络请求获得数据
OkGo.<String>get("http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1").execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
FoodBean foodBean = JSON.parseObject(response.body(), FoodBean.class);
list.addAll(foodBean.getData());
adapter.notifyDataSetChanged();
}
});
}
private void initView() {
rv_food = findViewById(R.id.rv_food);
line = (Button) findViewById(R.id.line);
line.setOnClickListener(this);
grid = (Button) findViewById(R.id.grid);
grid.setOnClickListener(this);
falls = (Button) findViewById(R.id.falls);
falls.setOnClickListener(this);
linearLayoutManager = new LinearLayoutManager(this);
gridLayoutManager = new GridLayoutManager(this, 4);
staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
adapter = new MyRecyclerViewAdapter(MainActivity.this, list);
//设置适配器
rv_food.setAdapter(adapter);
//设置布局方式
rv_food.setLayoutManager(linearLayoutManager);
//设置分割线
rv_food.addItemDecoration(new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL));
DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
defaultItemAnimator.setRemoveDuration(500); //设置两秒内慢慢删除
//设置删除动画
rv_food.setItemAnimator(defaultItemAnimator);
adapter.setListener(new ItemOnClickListener() {
@Override
public void clickListener(int position) {
list.remove(position);
//删除视图
adapter.notifyItemRemoved(position);
//重新整理下标
adapter.notifyItemRangeChanged(0,list.size());
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.line:
rv_food.setLayoutManager(linearLayoutManager);
break;
case R.id.grid:
rv_food.setLayoutManager(gridLayoutManager);
break;
case R.id.falls:
rv_food.setLayoutManager(staggeredGridLayoutManager);
break;
}
}
}
MyRecyclerViewAdapter类
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import java.util.List;
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private Context context;
private List<FoodBean.DataBean> list;
private ItemOnClickListener listener;
public MyRecyclerViewAdapter(Context context, List<FoodBean.DataBean> list) {
this.context = context;
this.list = list;
}
/***
* 创建自己ViewHolder的方法
* @param parent
* @param viewType
* @return
*/
@NonNull
@Override
public MyRecyclerViewAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == 0) {
//加载的行布局
View view = LayoutInflater.from(context).inflate(R.layout.rv_food_item_layout_left, parent, false);
return new MyViewHolder(view);
} else {
View view = LayoutInflater.from(context).inflate(R.layout.rv_food_item_layout_right, parent, false);
return new MyViewHolder(view);
}
}
/***
* 为每一行设置数据
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(@NonNull MyRecyclerViewAdapter.MyViewHolder holder, final int position) {
Glide.with(context)
.load(list.get(position).getPic())
.apply(RequestOptions.bitmapTransform(new RoundedCorners(20)))
.into(holder.imageView);
holder.textView.setText(list.get(position).getTitle());
//设置条目的监听
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.clickListener(position);
}
});
}
/***
*
* 根据位置返回要加载视图的类型
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
return position % 2;
}
/***
* 获得条目总数
* @return
*/
@Override
public int getItemCount() {
return list.size();
}
/***
* 自定义的ViewHolder类
*/
class MyViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
textView = itemView.findViewById(R.id.textView);
}
}
public ItemOnClickListener getListener() {
return listener;
}
public void setListener(ItemOnClickListener listener) {
this.listener = listener;
}
}
ItemOnClickListener类
public interface ItemOnClickListener {
void clickListener(int position);
}