在本篇博客当中结合xutils的注解模块,网络模块和图片模块,将网络数据获取解析并展示在recyclerview上面。
网络数据的网址为:https://gitee.com/little_bird_oh_777/test_data_collection/raw/master/dishs.xml
首先分析步骤:
1.导入包:xutils和recyclerview的包
3.2: 查找控件 使用xutils的注解模块进行查找
3.2.2接下来,对于recyclerview的适配器进行编写,具体步骤请看前两篇博客
然后就可以显示数据在recyclerview上了。以下为显示的效果图:
网络数据的网址为:https://gitee.com/little_bird_oh_777/test_data_collection/raw/master/dishs.xml
首先分析步骤:
1.导入包:xutils和recyclerview的包
复制xutils.jar包,粘贴到libs文件夹下,然后选中鼠标右键,然后点击Add As Library,点击ok
点击选择Project Structure--->选择当前的module---》选择 library dependenices
--->找到RecyclerView点击--->该版本号,改成和v7一样的版本号---》点击finish
2.绘制布局(2个布局,一个是activity对应的布局,另一个每一个item对应的布局)
3.编写逻辑代码 3.1 : 在application当中,初始化xUtils模块。(详情请见以下代码部分)
3.2: 查找控件 使用xutils的注解模块进行查找
3.3 : 设置RecyclerView的布局管理器 3.4:设置适配器 3.5: 获取网络数据
4.在清单文件里面添加网络权限。
开始编写代码内容:
2.1首先编写activity_xml_parse布局的代码:
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
app:subtitle="亲,你饿了么?"
app:subtitleTextColor="#FFF"
app:title="家常菜大全"
app:titleTextColor="#FFF">
</android.support.v7.widget.Toolbar>
<android.support.v7.widget.RecyclerView
android:id="@+id/yk_rv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
2.2 编写每一个item所对应的布局
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
app:subtitle="亲,你饿了么?"
app:subtitleTextColor="#FFF"
app:title="家常菜大全"
app:titleTextColor="#FFF">
</android.support.v7.widget.Toolbar>
<android.support.v7.widget.RecyclerView
android:id="@+id/yk_rv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
<?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="wrap_content"
android:padding="20dp">
<ImageView
android:id="@+id/item_yk_iv"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/item_yk_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/item_yk_iv"
android:text="油焖大虾"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/item_yk_food"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/item_yk_name"
android:layout_marginTop="10dp"
android:layout_toEndOf="@+id/item_yk_iv"
android:layout_toRightOf="@+id/item_yk_iv"
android:text="油,大虾,锅"
android:textSize="16sp" />
<TextView
android:id="@+id/item_yk_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/item_yk_iv"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:layout_marginEnd="20dp"
android:layout_marginRight="20dp"
android:text="数量:0"
android:textSize="16sp" />
</RelativeLayout>
3.1.创建application类的子类,并且初始化xUtils的模块。
public class UniteApp extends Application{
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
}
}
需要注意的是,我们需要把自定义的application类在清单文件当中进行注册。找到application标签,添加name属性,如 android:name=".UniteApp",注册之后的效果,如下图所示:
<?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="wrap_content"
android:padding="20dp">
<ImageView
android:id="@+id/item_yk_iv"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/item_yk_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/item_yk_iv"
android:text="油焖大虾"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/item_yk_food"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/item_yk_name"
android:layout_marginTop="10dp"
android:layout_toEndOf="@+id/item_yk_iv"
android:layout_toRightOf="@+id/item_yk_iv"
android:text="油,大虾,锅"
android:textSize="16sp" />
<TextView
android:id="@+id/item_yk_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/item_yk_iv"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:layout_marginEnd="20dp"
android:layout_marginRight="20dp"
android:text="数量:0"
android:textSize="16sp" />
</RelativeLayout>
public class UniteApp extends Application{
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
}
}
3.2.1 设置需要写的解析bean类
public class FoodBean {
private String name;
private String img;
private String burdens;
private String favorites;
public FoodBean() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public String getBurdens() {
return burdens;
}
public void setBurdens(String burdens) {
this.burdens = burdens;
}
public String getFavorites() {
return favorites;
}
public void setFavorites(String favorites) {
this.favorites = favorites;
}
}
3.2.2接下来,对于recyclerview的适配器进行编写,具体步骤请看前两篇博客
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_rv_yk,parent,false);
FoodViewHolder holder = new FoodViewHolder(itemView);
return holder;
}
@Override
public void onBindViewHolder(FoodViewHolder holder, int position) {
// 获取指定位置的数据
final FoodBean foodBean = mDatas.get(position);
holder.foodTv.setText(foodBean.getBurdens());
holder.nameTv.setText(foodBean.getName());
holder.numTv.setText("数量:"+foodBean.getFavorites());
// 加载网络图片 不用picasso,使用xutils的图片模块
x.image().bind(holder.iv,foodBean.getImg());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,foodBean.getName(),Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return mDatas.size();
}
class FoodViewHolder extends RecyclerView.ViewHolder{
ImageView iv;
TextView nameTv,foodTv,numTv;
public FoodViewHolder(View itemView) {
super(itemView);
iv = (ImageView) itemView.findViewById(R.id.item_yk_iv);
nameTv = (TextView) itemView.findViewById(R.id.item_yk_name);
foodTv = (TextView) itemView.findViewById(R.id.item_yk_food);
numTv = (TextView) itemView.findViewById(R.id.item_yk_num);
}
}
}
3.2.3 把解析数据的过程,封装成类。然后把解析的步骤,放到这个类的方法当中。
public class ParseXMLData {
public static List<FoodBean>parseXML(String s){
List<FoodBean>beanList = new ArrayList<>();
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser pullParser = factory.newPullParser();
ByteArrayInputStream stream = new ByteArrayInputStream(s.getBytes());
pullParser.setInput(stream,"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("dishs")) {
bean = new FoodBean();
}else if (name.equals("name")) {
bean.setName(pullParser.nextText());
}else if (name.equals("burdens")) {
bean.setBurdens(pullParser.nextText());
}else if (name.equals("favorites")) {
bean.setFavorites(pullParser.nextText());
}else if (name.equals("img")) {
bean.setImg(pullParser.nextText());
}
break;
case XmlPullParser.END_TAG:
if (name.equals("dishs")) {
beanList.add(bean);
}
break;
}
type = pullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return beanList;
}
}
3.2.4 准备工作完成了,编写activity当中的代码
@ContentView(R.layout.activity_xml_parse)
public class XmlParseActivity extends AppCompatActivity {
public String url = "https://gitee.com/little_bird_oh_777/test_data_collection/raw/master/dishs.xml";
@ViewInject(R.id.toolbar)
private Toolbar toolbar;
@ViewInject(R.id.yk_rv)
private RecyclerView rv;
private LinearLayoutManager manager;
private List<FoodBean> mDatas;
private FoodAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this); //初始化注解模块
// 设置布局管理者
manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
rv.setLayoutManager(manager);
// 设置数据源
mDatas = new ArrayList<>();
// 设置适配器
adapter = new FoodAdapter(this,mDatas);
rv.setAdapter(adapter);
// 加载网络数据的方法
loadWebData(url);
}
// 使用xutils的网络模块加载数据
private void loadWebData(String url) {
// 第一步:获取请求参数对象
RequestParams params = new RequestParams(url);
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String s) {
Log.i("AAA", "onSuccess: "+s);
Toast.makeText(XmlParseActivity.this,"网络获取数据成功!",Toast.LENGTH_SHORT).show();
// 代表请求数据成功会执行的方法 onPostExecute
// 解析数据的工作
List<FoodBean> beanList = ParseXMLData.parseXML(s);
// 将集合添加到数据源当中
mDatas.addAll(beanList);
// 提示适配器更新数据
adapter.notifyDataSetChanged();
}
@Override
public void onError(Throwable throwable, boolean b) {
// 请求数据失败会执行的方法
}
@Override
public void onCancelled(CancelledException e) {
// 请求数据取消会执行的方法
}
@Override
public void onFinished() {
// 请求数据完成会执行的方法
}
});
}
}
然后就可以显示数据在recyclerview上了。以下为显示的效果图: