一.简介
RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)
二.使用
1.利用RecyclerView做类似于快手app那种展示方式
首先要导入RecyclerView的依赖
implementation 'com.android.support:recyclerview-v7:28.0.0'//recyclerview
在布局中直接引用即可
<?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.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
RecyclerView有自己的适配器
所以在创建适配器时,需要继承自RecyclerView.Adapter
使用时首先要创建ViewHolder继承自RecyclerView.ViewHolder
然后泛型添入自创建的ViewHolder
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<VideoEntity.ListBean> datas;
private Context context;
private MyItemClickLister myItemClickLister;
public MyAdapter(List<VideoEntity.ListBean> datas, Context context) {
this.datas = datas;
this.context = context;
this.layoutInflater = LayoutInflater.from(context);
}
private LayoutInflater layoutInflater;
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = layoutInflater.inflate(R.layout.item, null);
return new MyViewHolder(view);
}
public void setMyItemClickLister(MyItemClickLister myItemClickLister) {
this.myItemClickLister = myItemClickLister;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int i) {
myViewHolder.teShow.setText(datas.get(i).getText());
Glide.with(context)
.load(datas.get(i).getImage1())
.transform(new CenterCrop())
.into(myViewHolder.imgShow);
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myItemClickLister.OnItemClick(i);
}
});
}
@Override
public int getItemCount() {
return datas.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView imgShow;
private TextView teShow;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imgShow = itemView.findViewById(R.id.img_show);
teShow = itemView.findViewById(R.id.te_show);
}
}
}
用来回调的接口
public interface MyItemClickLister {
void OnItemClick(int position);
}
展示的Activity
public class MainActivity extends AppCompatActivity {
private RecyclerView rv;
private List<VideoEntity.ListBean> datas = new ArrayList<>();
private String url = "http://api.budejie.com/api/api_open.php?a=list&c=data&type=41&page=1";
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initDatas();
}
private void initDatas() {
OkGo.<String>get(url)
.headers("User-Agent", "PostmanRuntime/7.23.0")//添加请求头
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
List<VideoEntity.ListBean> list = new Gson().fromJson(response.body(), VideoEntity.class).getList();
datas.addAll(list);
myAdapter.notifyDataSetChanged();
}
});
}
private void initViews() {
rv = (RecyclerView) findViewById(R.id.rv);
myAdapter = new MyAdapter(datas, this);
rv.setAdapter(myAdapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);//线性
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);//网格
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
rv.setLayoutManager(staggeredGridLayoutManager);//设置显示模式
myAdapter.setMyItemClickLister(new MyItemClickLister() {
@Override
public void OnItemClick(int position) {
VideoEntity.ListBean bean = datas.get(position);
Intent intent = new Intent(MainActivity.this, VideoActivity.class);
intent.putExtra("url", bean.getVideouri());
startActivity(intent);
}
});
}
}
播放视频的Activity
public class VideoActivity extends AppCompatActivity {
private VideoView vv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
initViews();
}
private void initViews() {
vv = (VideoView) findViewById(R.id.vv);
String url = getIntent().getStringExtra("url");
vv.setVideoPath(url);
vv.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
vv.start();
}
});
}
}
效果展示
2.利用RecyclerView做类似于购物车的展示
适配器
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private ArrayList<DishEntity.DataBean> list;
private Context context;
private MyListener myListener;
public MyAdapter(ArrayList<DishEntity.DataBean> list, Context context) {
this.list = list;
this.context = context;
}
public MyListener getMyListener() {
return myListener;
}
public void setMyListener(MyListener myListener) {
this.myListener = myListener;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
holder.tv_title.setText(list.get(position).getTitle() + "");
holder.tv_price.setText(list.get(position).getCollect_num() + "");
Glide.with(context)
.load(list.get(position).getPic())
.transform(new CenterCrop())//居中裁剪
.into(holder.iv);
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
list.get(position).setChecked(b);
count();
}
});
holder.iv_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//更新item的数量
int checkNum = list.get(position).getCheckNum();
checkNum++;
list.get(position).setCheckNum(checkNum);
holder.tv_num.setText(checkNum + "");
count();
}
});
holder.iv_jian.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//更新item的数量
int checkNum = list.get(position).getCheckNum();
if (checkNum > 0) {
checkNum--;
list.get(position).setCheckNum(checkNum);
holder.tv_num.setText(checkNum + "");
count();
}
}
});
}
//计算总价: 选中:单价*选中数量 未选中:不算
public void count() {
float count = 0;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).isChecked()) {//选中
float price = Float.parseFloat(list.get(i).getCollect_num());
int checkNum = list.get(i).getCheckNum();
count += price * checkNum;
}
}
if (myListener!=null){
myListener.onCount(count);
}
}
@Override
public int getItemCount() {
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
ImageView iv, iv_add, iv_jian, iv_delete;//加号 减号 删除
TextView tv_title, tv_num, tv_price;//介绍 数量 单价
CheckBox checkBox;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tv_title = itemView.findViewById(R.id.tv_title);
tv_num = itemView.findViewById(R.id.tv_num);
tv_price = itemView.findViewById(R.id.tv_price);
iv = itemView.findViewById(R.id.iv);
iv_add = itemView.findViewById(R.id.iv_add);
iv_jian = itemView.findViewById(R.id.iv_jian);
iv_delete = itemView.findViewById(R.id.iv_delete);
checkBox = itemView.findViewById(R.id.cb);
}
}
}
回调的接口
public interface MyListener {
void onCount(float count);
}
Activity
public class MainActivity extends AppCompatActivity {
private String url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1";
private ArrayList<DishEntity.DataBean> list = new ArrayList<>();
private MyAdapter myadapter;
private RecyclerView recyclerView;
private CheckBox cbAll;
private TextView countPrice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
OkGo.<String>get(url)
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
String body = response.body();
List<DishEntity.DataBean> data = new Gson().fromJson(body, DishEntity.class).getData();
list.addAll(data);
myadapter.notifyDataSetChanged();
}
});
}
private void initView() {
recyclerView = findViewById(R.id.rv);
countPrice = findViewById(R.id.tv_count);
cbAll = (CheckBox) findViewById(R.id.cb_all);
myadapter = new MyAdapter(list, this);
recyclerView.setAdapter(myadapter);
//设置布局方式
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
//设置分割线
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
myadapter.setMyListener(new MyListener() {
@Override
public void onCount(float count) {
countPrice.setText("¥" + count);
}
});
cbAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
for (int i = 0; i < recyclerView.getChildCount(); i++) {
View view = recyclerView.getChildAt(i);
CheckBox cb = view.findViewById(R.id.cb);
cb.setChecked(isChecked);
}
}
});
}
}
要开心加油