Retrofit请求网络解析json

举报
第三女神程忆难 发表于 2021/03/25 23:36:58 2021/03/25
【摘要】 懒得一大堆废话,说完实现最终目标,直接进入正题操作,直接上代码,看使用方法   实现目标:用Retrofit解析网络json,放到RecyclerView中   第一步,写好布局文件以及item,我这里用的RecyclerView,不知道RecyclerView就点进去看看,解析出来的格式就是,一个图片,一个文字,直接看布局文件和item。 加入依赖 implem...

懒得一大堆废话,说完实现最终目标,直接进入正题操作,直接上代码,看使用方法

 

实现目标:用Retrofit解析网络json,放到RecyclerView

 

第一步,写好布局文件以及item,我这里用的RecyclerView,不知道RecyclerView就点进去看看,解析出来的格式就是,一个图片,一个文字,直接看布局文件和item。

加入依赖

implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

 

加入RecyclerView


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <android.support.v7.widget.RecyclerView
  9. android:id="@+id/recyclerView"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
  12. </LinearLayout>

item:


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content">
  5. <ImageView
  6. android:id="@+id/imageView"
  7. android:layout_width="0dp"
  8. android:layout_height="120dp"
  9. android:layout_weight="2" />
  10. <TextView
  11. android:id="@+id/textView"
  12. android:layout_width="0dp"
  13. android:layout_height="120dp"
  14. android:layout_weight="3"
  15. android:gravity="center" />
  16. </LinearLayout>

 

之后写一个RecyclerView的适配器,用具加入图片和文字


  
  1. public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyHolder> {
  2. private Context context;
  3. private List<JavaBean.DataBean> data;//数据源集合
  4. //构造方法
  5. public RecyclerViewAdapter(Context context, List<JavaBean.DataBean> data) {
  6. this.context = context;
  7. this.data = data;
  8. }
  9. @NonNull
  10. @Override
  11. public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
  12. View inflate = LayoutInflater.from(context).inflate(R.layout.item, viewGroup, false);
  13. return new MyHolder(inflate);
  14. }
  15. @Override
  16. public void onBindViewHolder(@NonNull MyHolder myHolder, int i) {
  17. Picasso.with(context).load(data.get(i).getPic()).into(myHolder.imageView);//加入图片
  18. myHolder.textView.setText(data.get(i).getTitle());//加入名字
  19. }
  20. @Override
  21. public int getItemCount() {
  22. return data.size();//返回集合size
  23. }
  24. public class MyHolder extends RecyclerView.ViewHolder {
  25. ImageView imageView;
  26. TextView textView;
  27. public MyHolder(@NonNull View itemView) {
  28. super(itemView);
  29. imageView = itemView.findViewById(R.id.imageView);
  30. textView = itemView.findViewById(R.id.textView);
  31. }
  32. }
  33. }

提供网络字符串:http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1

 

写出解析类JavaBean类,即解析类!

 

接下来是重点,如何通过Retrofit获取网络数据,看java代码


  
  1. Retrofit retrofit = new Retrofit.Builder()
  2. .baseUrl("https://1604a.com/data/")//网络数据源,网址前半段
  3. .addConverterFactory(GsonConverterFactory.create())//解析
  4. .build();

 

创建接口,get请求方式,写入网址的后半段,即最后一个“/”之后的字符,像下面这么写


  
  1. public interface MyInterface {
  2. @GET("ymdx.json")
  3. Call<JavaBean> gerRequest();
  4. }

 

接着使用这个接口


  
  1. MyInterface myInterface = retrofit.create(MyInterface.class);
  2. Call<JavaBean> call = myInterface.gerRequest();

 

接下来写Call的一个方法enqueue,注释有详细标明


  
  1. call.enqueue(new Callback<JavaBean>() {
  2. //成功
  3. @Override
  4. public void onResponse(Call<JavaBean> call, Response<JavaBean> response) {
  5. //解析添加到创建的集合
  6. arrayList = response.body().getData();
  7. recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
  8. recyclerView.setItemAnimator(new DefaultItemAnimator());//RecyclerView动画:默认动画
  9. //使用适配器
  10. recyclerView.setAdapter(new RecyclerViewAdapter(MainActivity.this,arrayList));
  11. }
  12. //失败
  13. @Override
  14. public void onFailure(Call<JavaBean> call, Throwable t) {
  15. Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
  16. }
  17. });

 

看一下完整的java代码


  
  1. public class MainActivity extends AppCompatActivity {
  2. private List<JavaBean.DataBean> arrayList;
  3. private RecyclerView recyclerView;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. initView();
  9. Retrofit retrofit = new Retrofit.Builder()
  10. .baseUrl("https://1604a.com/data/")
  11. .addConverterFactory(GsonConverterFactory.create())
  12. .build();
  13. MyInterface myInterface = retrofit.create(MyInterface.class);
  14. Call<JavaBean> call = myInterface.gerRequest();
  15. call.enqueue(new Callback<JavaBean>() {
  16. //成功
  17. @Override
  18. public void onResponse(Call<JavaBean> call, Response<JavaBean> response) {
  19. //解析添加到创建的集合
  20. arrayList = response.body().getData();
  21. recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
  22. recyclerView.setItemAnimator(new DefaultItemAnimator());
  23. //使用适配器
  24. recyclerView.setAdapter(new RecyclerViewAdapter(MainActivity.this,arrayList));
  25. }
  26. //失败
  27. @Override
  28. public void onFailure(Call<JavaBean> call, Throwable t) {
  29. Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
  30. }
  31. });
  32. }
  33. private void initView() {
  34. recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
  35. }
  36. }

 

》》》》快速实例化控件《《《《

 

最重要的一步,加入网络权限:<uses-permission android:name="android.permission.INTERNET"/>

 

效果浏览:

 

文章来源: blog.csdn.net,作者:第三女神程忆难,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_40881680/article/details/82797370

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。