android之网络请求 -- 获取RecyclerView的列表项(图片 + 文字)

示意图,网络请求的地址,插件及依赖

在这里插入图片描述

网络请求的地址:

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类。
  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;

    @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<NetworkJson.DataBean>这个数组
        //那么你传给适配器的数组就会为空,就会报错
        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界面
    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图吧,哈哈哈!!!
在这里插入图片描述

发布了6 篇原创文章 · 获赞 6 · 访问量 2200

猜你喜欢

转载自blog.csdn.net/zk2000416/article/details/104907298
今日推荐