根据地址, 通过Retrofit 获取网络数据, 显示在RecycleView 中
需求:
地址:
http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1
获取的字段: title , image
1.1 网络请求 : Retrofit
1.2 控件的初始化 ButterKnife
1.3 图片的显示用Fresco
1.4 数据展示在RecycleView
实现:
1, 导入依赖
compile 'com.jakewharton:butterknife:8.8.1' compile 'com.jakewharton:butterknife-compiler:8.8.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.facebook.fresco:fresco:1.5.0'
2, 初始化Fresco
2.1 创建Application 的子类, MyApp
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); //初始化Fresco Fresco.initialize(this); } }
2.2 在清单文件中引入, 并且添加网络权限
<uses-permission android:name="android.permission.INTERNET" /> <application android:name=".demo03.MyApp" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
3, CookBookInterface.java --- 接口文件
public interface CookBookInterface { //http://www.qubaobei.com/ios/cf/ ----- dish_list.php?stage_id=1&limit=20&page=1 @GET("dish_list.php?stage_id=1&limit=20&page=1") Call<CookBook> getInfo(); }
4, CookBook.java --- 解析数据的实体类 -- GsonFormate生成的
5, RetrofitActivity02.java
/** * 通过Retrofit 获取菜谱信息, 展示在RecycleView 中 * 1, 导入依赖 * 2, 定义接口, 声明方法, 返回Call<实体类> * 3, 定义gson 解析的实体类 * 4, 使用Retrofit 获取数据 */ public class RetrofitActivity02 extends AppCompatActivity { //butterKnife 使用 Unbinder unbinder; //控件 @BindView(R.id.rv_id) RecyclerView mRv; //数据源 -- Retrofit获取网络数据 //适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_retrofit02); //TODO butterKnife 使用 unbinder = ButterKnife.bind(this); //TODO 声明布局管理器对象, (必须写), 设置RecycleView 显示的方式 // 上下文对象, 显示的格式, 是否需要反转数据 LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); mRv.setLayoutManager(manager); //1, 声明Retrofit 的构建者 Retrofit.Builder builder = new Retrofit.Builder(); //2, 设置公共的地址 builder.baseUrl("http://www.qubaobei.com/ios/cf/"); //3, 设置解析gson builder.addConverterFactory(GsonConverterFactory.create()); //4, 得到Retrofit 对象 Retrofit retrofit = builder.build(); //5, 得到接口 CookBookInterface cookBookInterface = retrofit.create(CookBookInterface.class); //6, 得到Call 的方法 Call<CookBook> call = cookBookInterface.getInfo(); //7, 传入接口回调 , 获取数据 call.enqueue(new Callback<CookBook>() { @Override public void onResponse(Call<CookBook> call, Response<CookBook> response) { //获取到的数据 CookBook cookBook = response.body(); //数据源 List<CookBook.DataBean> data = cookBook.getData(); //初始化适配器, 显示数据 MyAdapter adapter = new MyAdapter(RetrofitActivity02.this,data); mRv.setAdapter(adapter); } @Override public void onFailure(Call<CookBook> call, Throwable t) { } }); } }
6, RecycleView 展示数据的 MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private List<CookBook.DataBean> data; public MyAdapter(Context context, List<CookBook.DataBean> data) { this.context = context; this.data = data; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //创建ViewHolder View view = LayoutInflater.from(context).inflate(R.layout.item_rv,parent,false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { //赋值 holder.tv.setText(data.get(position).getTitle()); //图片 Uri uri = Uri.parse(data.get(position).getPic()); holder.sv.setImageURI(uri); } @Override public int getItemCount() { return data.size(); } class ViewHolder extends RecyclerView.ViewHolder { SimpleDraweeView sv; TextView tv; public ViewHolder(View itemView) { super(itemView); this.sv = (SimpleDraweeView) itemView.findViewById(R.id.iv_id); this.tv = (TextView) itemView.findViewById(R.id.tv_id); } } }
7, 布局页面
activity_retrofit02.xml
<?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="bw.com.bw_day11.demo03.RetrofitActivity02"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rv_id" /> </LinearLayout>
item_rv.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" > <!--fresco:roundAsCircle="true" 圆形图片--> <com.facebook.drawee.view.SimpleDraweeView android:layout_width="150dp" android:layout_height="150dp" fresco:placeholderImage="@mipmap/ic_launcher" android:id="@+id/iv_id"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_id" android:text="名称" android:textSize="25sp" android:layout_margin="10dp" android:textColor="@color/colorPrimary"/> </LinearLayout>