1.概述
? ? ? ?在(一)中已经讲解了最基本的用法啦,在(二)中主要就是进行进阶,用法都是与(一)中一致,只是list中的数据类型会变,数据类型变成Bean类型,recyclerView与retrofit结合使用
2.List<Bean>数据
之前我写的数据是string类型,在实际开发的时候都是Bean类型数据,
Step1:首先创建一个Bean对象:
public class ListV {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Step2:将数据改成Bean对象并进行数据初始化
private List<ListV> data1=new ArrayList<>();
//实现item中的东西
for(int i=0;i<100;i++){
//创建bean类
ListV listV=new ListV();
listV.setName("想学"+i);
//将bean类的数据加到data这个list当中
data1.add(listV);
}
Step3:传入Adapter中
//声明recyclerView
RecyclerView recyclerView=findViewById(R.id.rv);
//设置recycleView的布局
//线性布局
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this); recyclerView.setLayoutManager(linearLayoutManager);
//传adpter
MyrevAdpter myrevAdpter=new MyrevAdpter(data1,this);
recyclerView.setAdapter(myrevAdpter);
Step4:与(一)中一致
private List<ListV> data1;
private Context context;
//构造函数mainActivity传值
public MyrevAdpter(List<ListV> data1,Context context) {
this.data1 = data1;
this.context=context;
}
//生成view
@NonNull
@NotNull
@Override
public MyrevAdpter.MyViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
View view=View.inflate(context, R.layout.itemrv,null);
return new MyViewHolder(view);
}
//进行对view的操作,比如这里就是赋值
@Override
public void onBindViewHolder(@NonNull @NotNull MyrevAdpter.MyViewHolder holder, int position) {
holder.tv.setText(data1.get(position).getName());
Log.d("tag",String.valueOf(position));
}
//返回item的数量
@Override
public int getItemCount() {
return data1.size();
}
//利用一个viewHolder存储view,view里面的控件都在这里声明(注意这里是item里面的控件)
public class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tv;
public MyViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
tv=itemView.findViewById(R.id.tv1);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mOnItemClickListener==null){
mOnItemClickListener.onRecyclerItemClick(getAdapterPosition());
}
}
});
}
}
3.与Retrofit结合:
这里与retrofit相结合主要就是进行网络请求获取到返回的response,然而response一般是一个bean对象,所以又回到了上面的bean对象管理啦
先放上代码? 主要就是进行retrofit网络请求得到返回的bean对象,生成list数据(addData()方法是重点)
retrofit进行网络请求:
Step1:生成retrofit对象? 这里的baseUrl就是需要请求的url? addConverterFactory是json格式工厂
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://www.qubaobei.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
Step2:写接口:网络请求的Api接口,其中Get注解是指get方法,MenuResponse是返回的bean对象(这里我是自己写的bean对象),也可以直接写Response。
public interface IRetrofitService {
@GET
Call<MenuResponse> getUrl(@Url String url);
}
step3:声明接口进行call中enqueue()方法调用会重写onResponse()和onFailure()方法,其中onResponse()进行网络请求成功后的操作,onFailure()进行失败的操作。
IRetrofitService menuRequest=retrofit.create(IRetrofitService.class);
Call<MenuResponse> call=menuRequest.getUrl("ur");
call.enqueue(new Callback<MenuResponse>() {
@Override
public void onResponse(Call<MenuResponse> call, Response<MenuResponse> response) {
if(response.isSuccessful()){
Log.d("w网络获取成功",response.body().toString());
beanList.addAll(response.body().getData());
//自动刷新beanlist
retrofitAdapter.refresh(beanList);
}
}
@Override
public void onFailure(Call<MenuResponse> call, Throwable t) {
System.out.println("网络获取失败");
}
});
总体的Activity中的代码:
public class RecylerAndRertofitActivity extends AppCompatActivity {
private List<MenuResponse.DataBean> beanList=new ArrayList<>();
private RecyclerView recyclerView;
private RetrofitAdapter retrofitAdapter;
private String ur="https://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyler_and_rertofit);
addData();
initView();
}
private void initView() {
//找到recyclerView
recyclerView=findViewById(R.id.rv_retrofit);
//设置recyclerView管理器
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
//实例化adapter
retrofitAdapter=new RetrofitAdapter(beanList,this);
//传adapter
recyclerView.setAdapter(retrofitAdapter);
}
private void addData() {
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://www.qubaobei.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
IRetrofitService menuRequest=retrofit.create(IRetrofitService.class);
Call<MenuResponse> call=menuRequest.getUrl("ur");
call.enqueue(new Callback<MenuResponse>() {
@Override
public void onResponse(Call<MenuResponse> call, Response<MenuResponse> response) {
if(response.isSuccessful()){
Log.d("w网络获取成功",response.body().toString());
beanList.addAll(response.body().getData());
//自动刷新beanlist
retrofitAdapter.refresh(beanList);
}
}
@Override
public void onFailure(Call<MenuResponse> call, Throwable t) {
System.out.println("网络获取失败");
}
});
}
}
Adapter中的代码:
public class RetrofitAdapter extends RecyclerView.Adapter<RetrofitAdapter.MyViewHolder> {
private List<MenuResponse.DataBean> beanList;
private Context context;
public RetrofitAdapter(List<MenuResponse.DataBean> beanList,Context context) {
this.beanList = beanList;
this.context=context;
}
@NonNull
@NotNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.itemretrofit, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull @NotNull MyViewHolder holder, int position) {
Glide.with(context).load(beanList.get(position).getPic()).into(holder.image);
holder.name.setText(beanList.get(position).getTitle());
}
@Override
public int getItemCount() {
return beanList.size();
}
//刷新适配器
public void refresh(List<MenuResponse.DataBean> list){
this.beanList.addAll(list);
notifyDataSetChanged();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView image;//图片
private TextView name;//名字
public MyViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
image=itemView.findViewById(R.id.iv);
name=itemView.findViewById(R.id.tv_retrofit);
}
}
4.总结
? ? ?学到这里基础的recyclerview的展示就没有问题啦,先从简单的string类型的数据开始明白整个recyclerView的使用流程,然后在进阶到Bean的数据,最后再进阶到网络请求得到返回的Bean对象的数据!最重要的还是基础流程需要掌握就是(一)中的内容一定要自己手敲一遍体会一下先建什么再建什么。
后面还会更新一些子项item的点击事件、左滑删除、下拉刷新等等啦
|