Android开发----RecyclerView使用与retrofit结合(二)

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的点击事件、左滑删除、下拉刷新等等啦

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值