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’

代码架构

  1. 主界面:MainActivity.java , activity_main.xml
  2. RecyclerTask.java ,这个异步任务得到从网络上请求到的Json字符串。
  3. NetworkAdapter.java , 这个适配器用来展示ui界面。
  4. networkitem.xml, 适配器中每一项的布局情况。
  5. NetworkJson.java, 这个就是网络上获得的Json的Bean类。就是用GsonFormat来解析从网络上得到的JSON字符串,它可以用插件自动生成。
  6. 顺便说一下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;@Overrideprotected 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<NetworkJson.DataBean>这个数组//那么你传给适配器的数组就会为空,就会报错mHandler.postDelayed(run, 2000);}private List<NetworkJson.DataBean> mDataBeanList;@Overridepublic void getNetBean(List<NetworkJson.DataBean> bean) {mDataBeanList = bean;Log.d("bean", "bean -- >" + mDataBeanList.get(0).getId());}public Runnable run = new Runnable() {@Overridepublic void run() {LinearLayoutManager llm = new LinearLayoutManager(MainActivity.this, RecyclerView.VERTICAL, false);recycler.setLayoutManager(llm);recycler.setItemAnimator(new DefaultItemAnimator());recycler.addItemDecoration(new RecyclerView.ItemDecoration() {@Overridepublic 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.RecyclerViewandroid: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;//查询接口的apiprivate String climate_tep = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1";@Overrideprotected 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@Overridepublic InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View mView = LayoutInflater.from(mContext).inflate(R.layout.networkitem, parent, false);return new InnerHolder(mView);}@Overridepublic 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());//就只在这里用了GlideGlide.with(imageView.getContext()).load(bean.getPic()).into(imageView);}@Overridepublic 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的分割线--><ImageViewandroid:id="@+id/iv_image"android:layout_width="100dp"android:layout_height="68dp"android:scaleType="fitXY"/><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="7"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="2"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:textSize="19sp"android:text="名称:"android:gravity="center"/><TextViewandroid: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><Viewandroid:layout_width="match_parent"android:layout_height="2dp"android:background="#03A9F4"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="2"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:textSize="19sp"android:text="食材:"android:gravity="center"/><TextViewandroid: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之网络请求 -- 获取RecyclerView的列表项(图片 + 文字)相关推荐

  1. Android HTTP网络请求获取JSON数据

  2. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  3. 【小王的安卓之路】Android原生网络请求

    Android原生网络请求 一. 网络请求的必要性 二. 网络请求分类 三. 网络请求实现方法 四. 注意事项 一.网络请求的必要性: 如今单机APP早已经接近消失就连最简单的时钟日期等软件都需要去请 ...

  4. android SDK manager 无法获取更新版本列表【转载】

    http://mirrors.neusoft.edu.cn/eclipse/releases/luna/ 打开这个网址就可以看到adt的详细信息:  http://developer.android. ...

  5. JS 借助 pako.js 实现网络请求获取 gzip 数据流并解析, 解决汉字乱码

    1, 下载 pako.js => http://nodeca.github.io/pako/#Deflate.prototype.onData 2, 首先需要了解一下 XMLHttpReques ...

  6. 『Android』网络请求数据与JSON解析

    『Android』网络请求数据与JSON解析

  7. 利用Fiddler对Android手机网络请求进行抓包

    在Android的开发调试过程中,特别是针对网络编程的情况,很多时候我们希望能够对Android的网络请求进行抓包,用来定位以及分析我们程序的问题.下面我介绍使用Fiddler对Android模拟器的 ...

  8. fiddler 只监听模拟器_利用Fiddler对Android模拟器网络请求进行抓包【转】

    在Android的开发调试过程中,特别是针对网络编程的情况,很多时候我们希望能够对Android的网络请求进行抓包,用来定位以及分析我们程序的问题.下面我介绍使用Fiddler对Android模拟器的 ...

  9. Android通过网络URL获取图片并显示

    1.布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:to ...

最新文章

  1. 2020长沙“科技之星”榜单重磅揭晓,近百家企业凭实力“出道”!
  2. 世界银行拨款2293万美元支持印度并网屋顶太阳能
  3. python3 print设置不换行
  4. 基于智能计算的降维技术研究与应用
  5. 在Java应用程序中使用密码学
  6. VScode 开发stm32无法识别uint32_t,uint16_t,uint8_t问题
  7. 如何使用Node.js和CloudFormation在AWS Lambda中构建和部署GraphQL服务器
  8. mysql数据库导入导出_windows系统以及linux系统下的操作---linux工作笔记042
  9. Zabbix(六) zabbix主动模式监控
  10. SQL trace, 10046, trcsess and tkprof in Oracle 10g(转)
  11. c语言五子棋双链表,五子棋的悔棋函数怎么写啊。。。双击鼠标左键悔棋(菠萝镇楼)...
  12. 迪信通机器人_未来已来,迪信通携手达闼科技共研智能零售机器人
  13. ESP8266WIFI模块了解一下(新手入门级别)
  14. html如何使文本自动换行,html 文本自动换行
  15. Spark编程核心抽象—RDD
  16. 【CTR预估】 xDeepFM模型
  17. 高德地图:弧度飞线图层详解
  18. ie浏览器地址栏中文参数提交服务器乱码分析
  19. 计算机怎么复制公式,excel怎么复制公式 -电脑资料
  20. html5 u3m8,U3M8短语.doc

热门文章

  1. msyql慢查询相关
  2. 人工智能的发展对生活有什么影响?
  3. 2008 IT图书大盘点
  4. IT软件行业用契约锁实现“代理-销售-投标-项目-合作”电子签
  5. 响铃:滴滴“资源向安全和客服体系倾斜”的不完全建议
  6. 字幕助手 FastTitle 0.0.3 版本发布
  7. 高端蓝牙耳机哪个牌子好?四款高音质不错的蓝牙耳机推荐
  8. GitHub完整使用教程
  9. 【数学分析】数列的上极限与下极限
  10. Java虚拟机(JVM)面试题(2022年总结最全面的面试题!!!)