android之网络请求 -- 获取RecyclerView的列表项(图片 + 文字)
16lz
2021-12-04
android之网络请求 -- 获取RecyclerView的列表项
- 示意图,网络请求的地址,插件及依赖
- 代码架构
- 代码内容
- MainActivity.java
- activity_main.xml
- RecyclerTask.java
- NetworkAdapter.java
- networkitem.xml
- NetworkJson.java
- network_security_config.xml
- 总结
示意图,网络请求的地址,插件及依赖
示意图:
网络请求的地址:
http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1
插件:GsonFormat,用来解析Gson,在设置中的Plugins下载
依赖:在解析图片地址时,我用的是Glide,要添加它的依赖。
implementation ‘com.github.bumptech.glide:glide:4.3.1’
annotationProcessor ‘com.github.bumptech.glide:compiler:4.3.1’
代码架构
- 主界面:MainActivity.java , activity_main.xml
- RecyclerTask.java ,这个异步任务得到从网络上请求到的Json字符串。
- NetworkAdapter.java , 这个适配器用来展示ui界面。
- networkitem.xml, 适配器中每一项的布局情况。
- NetworkJson.java, 这个就是网络上获得的Json的Bean类。就是用GsonFormat来解析从网络上得到的JSON字符串,它可以用插件自动生成。
- 顺便说一下ActivityManifest中,首先添加一个权限,
<uses-permission android:name="android.permission.INTERNET" />
还要在Application下写一句话:android:networkSecurityConfig="@xml/network_security_config"
这是关于网络安全的,必须写!!!所以还需要写network_security_config.xml
代码内容
一些比较细节的地方或需要注意的地方我都写了注释
MainActivity.java
package com.example.myapplication;import android.graphics.Rect;import android.os.Bundle;import android.os.Handler;import android.util.Log;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.DefaultItemAnimator;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;import com.example.myapplication.Adapter.NetworkAdapter;import com.example.myapplication.Bean.NetworkJson;import com.example.myapplication.Task.RecyclerTask;import java.util.List;public class MainActivity extends AppCompatActivity implements RecyclerTask.NetBeanListener { private RecyclerView recycler; private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recycler = findViewById(R.id.recycler); //findViewById(R.id.button).setOnClickListener(this); RecyclerTask task = new RecyclerTask(); task.setNetBeanListener(this); //开始线程 task.execute(); mHandler = new Handler(); //如果不用Handler,直接获取的话, 你就没有给asyncTask一些时间来得到List这个数组 //那么你传给适配器的数组就会为空,就会报错 mHandler.postDelayed(run, 2000); } private List<NetworkJson.DataBean> mDataBeanList; @Override public void getNetBean(List<NetworkJson.DataBean> bean) { mDataBeanList = bean; Log.d("bean", "bean -- >" + mDataBeanList.get(0).getId()); } public Runnable run = new Runnable() { @Override public void run() { LinearLayoutManager llm = new LinearLayoutManager(MainActivity.this, RecyclerView.VERTICAL, false); recycler.setLayoutManager(llm); recycler.setItemAnimator(new DefaultItemAnimator()); recycler.addItemDecoration(new RecyclerView.ItemDecoration() { @Override public void getItemOffsets(@NonNull Rect outRect, int itemPosition, @NonNull RecyclerView parent) { super.getItemOffsets(outRect, itemPosition, parent); outRect.bottom = 5; outRect.left = 5; outRect.right = 5; outRect.top = 5; } }); NetworkAdapter adapter = new NetworkAdapter(MainActivity.this, mDataBeanList); recycler.setAdapter(adapter); } };}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" android:fitsSystemWindows="true" android:id="@+id/ll_content" android:background="#03A9F4"><!--上面设置一个颜色的目的就是便于观察那个recyclerview的分割线--> <androidx.recyclerview.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recycler" /></RelativeLayout>
RecyclerTask.java
package com.example.myapplication.Task;import android.os.AsyncTask;import com.example.myapplication.Bean.NetworkJson;import com.google.gson.Gson;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.nio.charset.StandardCharsets;import java.util.List;public class RecyclerTask extends AsyncTask<Void, Void, String > { //获得要解析的json字符串 private String mEnd; private String city; private List<NetworkJson.DataBean> mJson; //查询接口的api private String climate_tep = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1"; @Override protected String doInBackground(Void...voids) { //地址字符串 try { URL url = new URL(climate_tep); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //请求方法 conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(10000); conn.setRequestProperty("Accept", "*/*"); conn.setRequestProperty("Accept-Language", "zh-CN"); //conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); //支持火狐浏览器 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0"); conn.connect(); //返回码为200代表连接成功 if (conn.getResponseCode() == 200) { //得到原始的输入流 InputStream is = conn.getInputStream(); ByteArrayOutputStream os = new ByteArrayOutputStream(); byte[] bytes = new byte[1024]; int len = 0; while ((len = is.read(bytes) ) != -1) { os.write(bytes, 0, len); } byte[] array = os.toByteArray(); mEnd = new String(array, StandardCharsets.UTF_8); conn.disconnect(); } } catch (Exception e) { e.printStackTrace(); } return mEnd; } @Override //能在这个线程中操作ui界面,但这里我并没有操作ui,我是直接使用的接口。 protected void onPostExecute(String s) { super.onPostExecute(s); try { Gson gson = new Gson(); NetworkJson networkJson = gson.fromJson(mEnd, NetworkJson.class); mJson = networkJson.getData(); mNetBeanListener.getNetBean(mJson); } catch (Exception e) { e.printStackTrace(); } } private NetBeanListener mNetBeanListener; public interface NetBeanListener{ void getNetBean(List<NetworkJson.DataBean> bean); } public void setNetBeanListener(NetBeanListener listener) { mNetBeanListener = listener; }}
NetworkAdapter.java
package com.example.myapplication.Adapter;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import androidx.annotation.NonNull;import androidx.recyclerview.widget.RecyclerView;import com.bumptech.glide.Glide;import com.example.myapplication.Bean.NetworkJson;import com.example.myapplication.R;import java.util.List;public class NetworkAdapter extends RecyclerView.Adapter<NetworkAdapter.InnerHolder> { private Context mContext; private List<NetworkJson.DataBean> list = null; public NetworkAdapter(Context context, List<NetworkJson.DataBean> beanList) { mContext = context; list = beanList; } @NonNull @Override public InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View mView = LayoutInflater.from(mContext).inflate(R.layout.networkitem, parent, false); return new InnerHolder(mView); } @Override public void onBindViewHolder(@NonNull InnerHolder holder, int position) { View itemView = holder.itemView; ImageView imageView = itemView.findViewById(R.id.iv_image); TextView textView1 = itemView.findViewById(R.id.tv_text1); TextView textView2 = itemView.findViewById(R.id.tv_text2); NetworkJson.DataBean bean = list.get(position); textView1.setText(bean.getTitle()); textView2.setText(bean.getFood_str()); //就只在这里用了Glide Glide.with(imageView.getContext()).load(bean.getPic()).into(imageView); } @Override public int getItemCount() { return list.size(); } static class InnerHolder extends RecyclerView.ViewHolder { InnerHolder(@NonNull View itemView) { super(itemView); } }}
networkitem.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="#ffffff"> <!--上面的颜色也是为了显示recyclerview的分割线--> <ImageView android:id="@+id/iv_image" android:layout_width="100dp" android:layout_height="68dp" android:scaleType="fitXY"/> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="7" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:textSize="19sp" android:text="名称:" android:gravity="center"/> <TextView android:id="@+id/tv_text1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:gravity="start|center_vertical" tools:ignore="NestedWeights" android:textSize="13sp"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="2dp" android:background="#03A9F4"/> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:textSize="19sp" android:text="食材:" android:gravity="center"/> <TextView android:id="@+id/tv_text2" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:gravity="start|center_vertical" android:textSize="13sp"/> </LinearLayout> </LinearLayout></LinearLayout>
NetworkJson.java
package com.example.myapplication.Bean;import java.util.List;public class NetworkJson { /** * ret : 1 * data : [{"id":"3468","title":"凉拌麻辣麻酱鸡块","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/4/3468.jpg","collect_num":"68","food_str":"鸡 麻酱 生抽 盐 味精 糖 醋 葱丝 麻椒 辣椒 芝麻 麻酱","num":68},{"id":"72869","title":"花边韭菜盒子","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/73/72869.jpg","collect_num":"67","food_str":"面粉 韭菜 鸡蛋 虾皮 香油","num":67},{"id":"2311","title":"三鲜豆皮","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2311.jpg","collect_num":"67","food_str":"肉丁 香菇 香干 冬笋 糯米","num":67},{"id":"67","title":"豆沙卷面包","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/1/67.jpg","collect_num":"67","food_str":"高筋面粉 红豆沙 水 干酵母 细砂糖","num":67},{"id":"24251","title":"牛奶煨白菜","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/25/24251.jpg","collect_num":"67","food_str":"娃娃菜 牛奶 纯净水 盐 枸杞","num":67},{"id":"2759","title":"猪油渣炒西兰花","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2759.jpg","collect_num":"67","food_str":"西兰花 肥肉 大蒜 油 盐","num":67},{"id":"5399","title":"不加任何调料且鲜美的鸭子汤","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/6/5399.jpg","collect_num":"66","food_str":"鸭子 千张包 火腿 扁尖笋 杏鲍菇","num":66},{"id":"2724","title":"芋儿烧肉","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2724.jpg","collect_num":"66","food_str":"猪肉 芋儿 油 豆瓣 姜","num":66},{"id":"57560","title":"红珍珠椰露冰","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/58/57560.jpg","collect_num":"66","food_str":"荸荠 甜菜根汁 玉米淀粉 椰浆 砂糖","num":66},{"id":"27031","title":"杏鲍菇香肠杂烩披萨","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/28/27031.jpg","collect_num":"64","food_str":"高粉 低粉 糖 酵母粉 盐","num":64},{"id":"77505","title":"香煎培根金针菇卷","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/78/77505.jpg","collect_num":"64","food_str":"培根 金针菇 黑胡椒碎 熟白芝麻","num":64},{"id":"2677","title":"毛豆炒肉丁","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2677.jpg","collect_num":"64","food_str":"毛豆 肉丁 盐 味精 芡粉","num":64},{"id":"2613","title":"苹果煮猪肉","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2613.jpg","collect_num":"64","food_str":"猪肉 苹果 洋葱 迷你番茄 芦笋","num":64},{"id":"2750","title":"豆豉肉片烧冬瓜","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2750.jpg","collect_num":"64","food_str":"冬瓜 肉片 豆豉 油 盐","num":64},{"id":"15420","title":"百福玉满堂","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/16/15420.jpg","collect_num":"63","food_str":"口蘑 香菇 北豆腐 鸡蛋 猪肉馅","num":63},{"id":"10394","title":"油焖春笋","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/11/10394.jpg","collect_num":"63","food_str":"春笋 高汤 生抽 老抽 糖","num":63},{"id":"64527","title":"西葫芦虾干饺子","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/65/64527.jpg","collect_num":"63","food_str":"西葫芦 泡发黑木耳 绿豆粉丝 干虾仁 泡发冬菇","num":63},{"id":"2403","title":"汽水肉","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/3/2403.jpg","collect_num":"62","food_str":"里脊肉 肥肉 生姜 葱花 盐","num":62},{"id":"77473","title":"清蒸扇贝金针菇","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/78/77473.jpg","collect_num":"62","food_str":"扇贝肉 金针菇 香葱 生姜 大蒜","num":62},{"id":"7402","title":"喳咋","pic":"http://www.qubaobei.com/ios/cf/uploadfile/132/8/7402.jpg","collect_num":"61","food_str":"黑豆 红豆 绿豆 花生 薏仁","num":61}] */ private int ret; private List<DataBean> data; public int getRet() { return ret; } public void setRet(int ret) { this.ret = ret; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { /** * id : 3468 * title : 凉拌麻辣麻酱鸡块 * pic : http://www.qubaobei.com/ios/cf/uploadfile/132/4/3468.jpg * collect_num : 68 * food_str : 鸡 麻酱 生抽 盐 味精 糖 醋 葱丝 麻椒 辣椒 芝麻 麻酱 * num : 68 */ private String id; private String title; private String pic; private String collect_num; private String food_str; private int num; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPic() { return pic; } public void setPic(String pic) { this.pic = pic; } public String getCollect_num() { return collect_num; } public void setCollect_num(String collect_num) { this.collect_num = collect_num; } public String getFood_str() { return food_str; } public void setFood_str(String food_str) { this.food_str = food_str; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } }}
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?><network-security-config xmlns:android="http://schemas.android.com/apk/res/android"> <base-config cleartextTrafficPermitted="true" /></network-security-config>
总结
也没有多少代码吧,如果有不懂的可以自己调试或者问我也行!
另外,我没有给列表项添加点击事件!
再上一个GIF图吧,哈哈哈!!!
更多相关文章
- Android(安卓)RxJava与Retrofit与RecyclerView与Fresco结合网络
- Android中app的请求抓包工具 Fiddler 详解
- Android(安卓)Volley框架使用详解
- android翻译应用、地图轨迹、视频广告、React Native知乎日报、
- Android(安卓)HttpClient上传文件与Httpconnection知识小结
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上
- Android(安卓)网络(一) HTTP协议
- Android中的几种网络请求方式详解
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上