IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android开发----RecyclerView使用与retrofit结合(二) -> 正文阅读

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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:43:53  更:2021-11-30 15:45:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:27:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码