概述
首先先屡一下思路,把步骤在脑海当中形成:
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获取网络数据并解析显示的过程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复