我是靠谱客的博主 爱笑发带,最近开发中收集的这篇文章主要介绍RecyclerView获取网络数据并解析显示的过程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先先屡一下思路,把步骤在脑海当中形成:
1.倒入包   okhttp相关包放到libs文件夹下---》右键选择Add  As  Library--->选择ok
选择Project Structure--->选择当前的module---》选择 library dependenices
--->找到RecyclerView点击--->该版本号,改成和v7一样的版本号---》点击finish
导入Picasso到应用程序当中。
2.画布局
*      向绘制activity界面的布局
*      在绘制每一个item条目的布局,注意事项,要把最外层的布局的高度写成wrap_content
3.编写逻辑代码
*      3.1 查找控件
*      3.2 设置RecyclerView的逻辑代码
*             3.2.1  设置布局管理器
*             3.2.2   设置数据源  分析集合当中存储的数据类型是什么,将这个类创建出来。
*             3.2.3   设置适配器
*     3.3 加载网路数据
*            3.3.1  创建一个方法,用户获取网络请求
*            3.3.2  创建异步任务对象,在尖角号当中传入三个参数 Void  Void  String  调用execute的方法
*                  并且需要重写2个方法:doInBackground   onPostExecute
*            3.3.3  创建一个类,写网络请求数据的方法
*            3.3.4  在doInbackground方法当中调用网络请求数据的方法,然后获取数据,并返回
*            3.3.5  在onPostExecute方法当中,获取参数,就是网络数据,然后解析
*            3.3.6  将解析到的数据添加到RecyclerView的数据源当中,并且提示适配器更新数据
*
4. 在清单文件当中 添加网络权限
5. 如果要求用Toolbar ,取消标题栏
*      找到清单文件当中application里面的 android:theme="@style/AppTheme" 点击control跳转
*      将DarkActionBar  改成NoActionBar
我们就直接进行第二部绘制布局:

先绘制activity的布局:

<?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"
    android:orientation="vertical"
    tools:context="com.animee.day17.MainActivity">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        app:logo="@mipmap/ic_launcher"
        app:title="美食大全"
        app:subtitle="美食不是天天有,你饿了么?"
        app:titleTextColor="#FFFFFF"
        app:subtitleTextColor="#FFFFFF"/>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/food_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
</LinearLayout>

然后绘制每一个item的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/item_iv"
        android:layout_width="140dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:scaleType="centerCrop"
        app:srcCompat="@mipmap/ic_launcher" />
    <TextView
        android:id="@+id/item_tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/item_iv"
        android:layout_marginLeft="10dp"
        android:layout_marginStart="10dp"
        android:layout_toEndOf="@+id/item_iv"
        android:layout_toRightOf="@+id/item_iv"
        android:textSize="22sp"
        android:textColor="@color/colorAccent"
        android:text="" />
    <TextView
        android:id="@+id/item_tv_food"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/item_tv_title"
        android:layout_alignStart="@+id/item_tv_title"
        android:layout_below="@+id/item_tv_title"
        android:layout_marginTop="10dp"
        android:textSize="16sp"
        android:text="" />
    <TextView
        android:id="@+id/item_tv_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/item_iv"
        android:layout_alignLeft="@+id/item_tv_food"
        android:layout_alignStart="@+id/item_tv_food"
        android:textSize="16sp"
        android:text="收藏数:110" />
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="@color/colorPrimary"
        android:layout_marginTop="10dp"
        android:layout_below="@+id/item_iv"/>
</RelativeLayout>

然后开始准备工具类的编写,先编写获取网络请求的工具类:(注意要导入jar包)

public class HttpUtils {
    public static String getStringByOkhttp(String path){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().get().url(path).build();
        try {
            Response response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                ResponseBody body = response.body();
                return body.string();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

然后创建一个能够数据的类,作为bean类

public class FoodBean {
    private String title;
    private String pic;
    private String num;
    private String id;
    private String food_str;
    private String collect_num;
    public String getPic() {
        return pic;
    }
    public void setPic(String pic) {
        this.pic = pic;
    }
    public String getNum() {
        return num;
    }
    public void setNum(String num) {
        this.num = num;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getFood_str() {
        return food_str;
    }
    public void setFood_str(String food_str) {
        this.food_str = food_str;
    }
    public String getCollect_num() {
        return collect_num;
    }
    public void setCollect_num(String collect_num) {
        this.collect_num = collect_num;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public FoodBean() {
    }
    public FoodBean(String title, String pic, String num, String id, String food_str, String collect_num) {
        this.title = title;
        this.pic = pic;
        this.num = num;
        this.id = id;
        this.food_str = food_str;
        this.collect_num = collect_num;
    }
}

然后开始正式编写activity当中的代码:

public class MainActivity extends AppCompatActivity {
    private Toolbar toolbar;
    private RecyclerView foodRv;
    private LinearLayoutManager manager;
    private List<FoodBean> mDatas;
    private FoodAdapter adapter;
    public String url = "https://raw.githubusercontent.com/zhang721788/testmaterial/master/data.xml";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        查找控件
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        foodRv = (RecyclerView) findViewById(R.id.food_rv);

//      设置布局管理器
        manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        foodRv.setLayoutManager(manager);
//        设置数据源
        mDatas = new ArrayList<>();
//        设置适配器
        adapter = new FoodAdapter(this,mDatas);
        foodRv.setAdapter(adapter);
//        记载网络数据
        loadWebData(url);
    }
    private void loadWebData(final String url) {
        new AsyncTask<Void,Void,String>(){
            @Override
            protected String doInBackground(Void... params) {
//                执行网络请求
                String s = HttpUtils.getStringByOkhttp(url);
                return s;
            }
            @Override
            protected void onPostExecute(String s) {
                if (s!=null&&!s.isEmpty()) {
//                    解析数据 :解析成功之后要什么,解析之后的数据给RecyclerView来显示
                    List<FoodBean> beanList = ParseXMLData.parseXML(s);
//                  获取到网络数据,并且解析了,添加数据到数据源当中
//                    数据源:适配器当中传递的集合对象,就是数据源
                    mDatas.addAll(beanList);
//                    提示adapter更新数据
                    adapter.notifyDataSetChanged();
                }
            }
        }.execute();
    }
}

对于xml数据解析的相关操作,单独写一个类完成:

public class ParseXMLData {
    public static List<FoodBean> parseXML(String s){
        List<FoodBean>mDatas = new ArrayList<>();
//      固定步骤:
//        1.获得工厂类对象 2.获取解析器对象 3.设置要求解析的数据 4.获取正在被解析的标签的类型
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser pullParser = factory.newPullParser();
//            将字符串转变成InputStream的过程
            ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes());
            pullParser.setInput(bais,"utf-8");

            int type = pullParser.getEventType();
            FoodBean bean = null;
//            循环判断有没有到文档结束的部分
            while (type != XmlPullParser.END_DOCUMENT) {
//                获取正在被解析的标签名
                String name = pullParser.getName();
                switch (type) {
                    case XmlPullParser.START_TAG:
                        if (name.equals("food")) {
                            bean = new FoodBean();
                        }else if (name.equals("title")) {
                            bean.setTitle(pullParser.nextText());
                        }else if (name.equals("pic")) {
                            bean.setPic(pullParser.nextText());
                        }else if (name.equals("num")) {
                            bean.setNum(pullParser.nextText());
                        }else if (name.equals("id")) {
                            bean.setId(pullParser.nextText());
                        }else if (name.equals("food_str")) {
                            bean.setFood_str(pullParser.nextText());
                        }else if (name.equals("collect_num")) {
                            bean.setCollect_num(pullParser.nextText());
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if (name.equals("food")) {
                            mDatas.add(bean);
                        }
                        break;
                }
                type = pullParser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mDatas;
    }

}

设置适配器的过程当中,需要构建适配器对象,RecyclerView创建适配器的过程如下:

1.创建一个类继承RecyclerView.Adapter<>
2.在类的内部创建一个类,继承RecyclerView.ViewHolder,创建构造方法
3.将内部类的名称放置到外部类的<>当中,重写三个方法
*      onCreateViewHolder   onBindViewHolder   getItemCount
4.创建成员变量   1.Context    2.数据源
5.通过构造函数对于成员变量进行赋值
6.在onCreateViewHolder方法当中创建每一个item对应的view,
*      创建自定义的ViewHolder的对象,将获取到的view作为参数传递
*      返回holder对象  ,对于每一个item的布局控件,在holder的构造函数当中进行初始化
7. 在onBindViewHolder方法当中获取到当前位置的数据
*      对于holder当中定义的控件,进行一一显示
8.  在getItemCount方法当中,返回数据集合的长度

参考代码如下:

public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.FoodViewHolder>{
    private Context context;
    private List<FoodBean>mDatas;
    public FoodAdapter(Context context, List<FoodBean> mDatas) {
        this.context = context;
        this.mDatas = mDatas;
    }
    @Override
    public FoodViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false);
        FoodViewHolder holder = new FoodViewHolder(itemView);
        return holder;
    }
    @Override
    public void onBindViewHolder(FoodViewHolder holder, int position) {
        FoodBean foodBean = mDatas.get(position);
        holder.titleTv.setText(foodBean.getTitle());
        holder.foodTv.setText(foodBean.getFood_str());
        holder.numTv.setText("收藏数:"+foodBean.getCollect_num());
//      使用Picasso加载ImageView的图片
        Picasso.with(context).load(foodBean.getPic()).into(holder.iv);
    }
    @Override
    public int getItemCount() {
        return mDatas.size();
    }
    class FoodViewHolder extends RecyclerView.ViewHolder{
        TextView titleTv,foodTv,numTv;
        ImageView iv;
        public FoodViewHolder(View itemView) {
            super(itemView);
            titleTv = (TextView) itemView.findViewById(R.id.item_tv_title);
            foodTv = (TextView) itemView.findViewById(R.id.item_tv_food);
            numTv = (TextView) itemView.findViewById(R.id.item_tv_num);
            iv = (ImageView) itemView.findViewById(R.id.item_iv);
        }
    }
}
最重要的,最后要记得添加网路权限!!!!

最后

以上就是爱笑发带为你收集整理的RecyclerView获取网络数据并解析显示的过程的全部内容,希望文章能够帮你解决RecyclerView获取网络数据并解析显示的过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部