2.技能描述:
实现如图所示效果,使用DrawerLayout实现页面左侧滑出,页面左侧抽屉页面包含头像和4个条目,图片可以使用小机器人图标,右侧内容显示列表,从以下接口地址获取网络数据:
http://data.v.qq.com/videocms/getNewsvideoList.php?ref=pclient&appkey=6UkwV9DeHr9_PC&vsite=new_vshou&ename=new_vs_feature&report=web.news&_=1504358456351
注意:获取接口的数据需要用字符串替换的方式去除掉最前面的“content(”和最后面“);”只保留content()中间的json数据。
获取到网络数据后根据有无“vplus_pic”字段进行多条目加载,当没有vplus_pic字段时,列表条目只显示标题文字,有vplus_pic字段时,列表条目显示图片,图片地址即为vplus_pic中获取的值。
使用Universal-Image-Loader加载图片,全局配置Universal-Image-Loader,设置加载中和加载失败时的图片为小机器人,设置开启内存缓存和磁盘缓存,设置加载图片的线程数为3。
实现思路:
1. 整体布局使用DrawerLayout(5分),DrawerLauout的抽屉页面包含上方的头像和下方的4个条目(5分)
2. 封装网络请求工具类(5分),进入页面后,开启子线程,在子线程中调用网络请求获取数据(5分)
3. 获取到网络数据之后,进行字符串替换(5分),替换后的数据进行解析(5分),解析后的数据回调到主线程中(5分)
4. 为ListView添加适配器,传入解析后的数据(5分),重写自定义适配器的几个重要方法(5分)
5. 重写适配器的多条目加载方法(5分),根据vplus_pic的有无进行判断,返回两种类型(5分)
6. 提供多条目加载的两种布局文件,在获取条目视图的方法中根据类型进行加载(5分)
7. Application中全局初始化Universal-Image-Loader(5分),设置加载中和加载失败的图片(5分),配置开启磁盘缓存和内存缓存(5分),配置加载图片的线程数(5分)
8. 适配器中使用Universal-Image-Loader进行加载图片(5分)
9. 数据加载完成后刷新适配器(5分)
10. 要求:
项目名称命名规范,姓名+时间,例:张三,项目名称为-Zhangsan20171113,项目包名为com.bwie.姓名全拼(5分),功能代码模块中加入注释。(5分)
MainActivity
package com.bwei.lifangxin20171113;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.google.gson.Gson;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
/**
* 1. 整体布局使用DrawerLayout(5分),DrawerLauout的抽屉页面包含上方的头像和下方的4个条目(5分)
*2.2,进入页面后,开启子线程,在子线程中调用网络请求获取数据(5分)
*/
public class MainActivity extends AppCompatActivity {
String urlstr="http://data.v.qq.com/videocms/getNewsvideoList.php?ref=pclient&appkey=6UkwV9DeHr9_PC&vsite=new_vshou&ename=new_vs_feature&report=web.news&_=1504358456351";
private DrawerLayout drawer;
private ListView dl_lv;
private ListView lv;
List<JavaBean.DataBean.ContentBean> list = new ArrayList<>();
String dlStr[] = {"客服热线","营业部网点","系统设置","换肤"};
private String s;
private List<JavaBean.DataBean.ContentBean> content;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//判断网络
// NetUtils.getNetType(this);
//使用butterKnife来注解控件;
//ButterKnife.bind(this);
//初始化布局和试图
initView();
//初始化DrawerLayout数据
initData();
//给Item设置点击事件 关闭侧滑
setListener();
//开启子线程,在子线程中调用网络请求获取数据
// startThread();
//为ListView添加适配器,传入解析后的数据(5分),重写自定义适配器的几个重要方法(5分)
adapter = new MyAdapter();
lv.setAdapter(adapter);
new MyAsyncTask().execute(urlstr);
//数据加载完成后刷新适配器(5分)
adapter.notifyDataSetChanged();
}
private void setListener() {
dl_lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//关闭drawer
drawer.closeDrawer(dl_lv);
}
});
}
private void initView() {
drawer = findViewById(R.id.drawer);
dl_lv = findViewById(R.id.dl_lv);
lv = findViewById(R.id.lv);
}
private void initData() {
ArrayList<String> lists = new ArrayList<>();
for (int i = 0 ; i <4 ; i++){
lists.add(dlStr[i]);
}
ArrayAdapter<String> stringArrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, lists);
dl_lv.setAdapter(stringArrayAdapter);
}
//去除json串的不合格
private String doStr(String str) {
String str1 = str.replace("content(","").replace(");","");
return str1;
}
class MyAsyncTask extends AsyncTask<String,Void,String> {
//子线程方法,进行联网操作
@Override
protected String doInBackground(String... strings) {
String s = strings[0];
//直接用工具类获取json
String netJson = NetUtils.getNetJson(s);
String replace = netJson.replace("content(", "").replace(");", "");
return replace;//返回给(前台方法,主线程方法onPostExecute)
}
//主线程方法,可以直接进行更新UI
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Gson gson = new Gson();
JavaBean javaBean = gson.fromJson(s, JavaBean.class);
JavaBean.DataBean data = javaBean.getData();
content = data.getContent();
list.addAll(content);
adapter.notifyDataSetChanged();
}
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
int itemViewType = getItemViewType(i);
switch (itemViewType){
case 0:
ViewHolder1 holder = null;
if(view==null){
holder = new ViewHolder1();
view = View.inflate(MainActivity.this, R.layout.lv_item, null);
holder.lv_tv1 = (TextView) view.findViewById(R.id.lv_tv1);
view.setTag(holder);
}else{
holder = (ViewHolder1) view.getTag();
}
holder.lv_tv1.setText(list.get(i).getSubtitle());
// ImageLoader.getInstance().displayImage(list.get(i).getPic_url(),holder.i);
break;
case 1:
ViewHolder2 holder2 = null;
if(view==null){
holder2 = new ViewHolder2();
view = View.inflate(MainActivity.this, R.layout.lv_item2, null);
holder2.lv_tv2 = (TextView) view.findViewById(R.id.lv_tv2);
holder2.lv_img2 = (ImageView) view.findViewById(R.id.lv_img2);
view.setTag(holder2);
}else{
holder2 = (ViewHolder2) view.getTag();
}
holder2.lv_tv2.setText(list.get(i).getTitle());
ImageLoader.getInstance().displayImage(list.get(i).getPic_url(),holder2.lv_img2);
break;
}
return view;
}
//重写适配器的多条目加载方法(5分)
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
String vplus_pic = content.get(position).getVplus_pic();
//根据vplus_pic的有无进行判断,返回两种类型(5分)
if(vplus_pic == null ){
return 0;
}else {
return 1;
}
}
}
class ViewHolder1{
TextView lv_tv1;
}
class ViewHolder2{
TextView lv_tv2;
ImageView lv_img2;
}
}
实现如图所示效果,使用DrawerLayout实现页面左侧滑出,页面左侧抽屉页面包含头像和4个条目,图片可以使用小机器人图标,右侧内容显示列表,从以下接口地址获取网络数据:
http://data.v.qq.com/videocms/getNewsvideoList.php?ref=pclient&appkey=6UkwV9DeHr9_PC&vsite=new_vshou&ename=new_vs_feature&report=web.news&_=1504358456351
注意:获取接口的数据需要用字符串替换的方式去除掉最前面的“content(”和最后面“);”只保留content()中间的json数据。
获取到网络数据后根据有无“vplus_pic”字段进行多条目加载,当没有vplus_pic字段时,列表条目只显示标题文字,有vplus_pic字段时,列表条目显示图片,图片地址即为vplus_pic中获取的值。
使用Universal-Image-Loader加载图片,全局配置Universal-Image-Loader,设置加载中和加载失败时的图片为小机器人,设置开启内存缓存和磁盘缓存,设置加载图片的线程数为3。
实现思路:
1. 整体布局使用DrawerLayout(5分),DrawerLauout的抽屉页面包含上方的头像和下方的4个条目(5分)
2. 封装网络请求工具类(5分),进入页面后,开启子线程,在子线程中调用网络请求获取数据(5分)
3. 获取到网络数据之后,进行字符串替换(5分),替换后的数据进行解析(5分),解析后的数据回调到主线程中(5分)
4. 为ListView添加适配器,传入解析后的数据(5分),重写自定义适配器的几个重要方法(5分)
5. 重写适配器的多条目加载方法(5分),根据vplus_pic的有无进行判断,返回两种类型(5分)
6. 提供多条目加载的两种布局文件,在获取条目视图的方法中根据类型进行加载(5分)
7. Application中全局初始化Universal-Image-Loader(5分),设置加载中和加载失败的图片(5分),配置开启磁盘缓存和内存缓存(5分),配置加载图片的线程数(5分)
8. 适配器中使用Universal-Image-Loader进行加载图片(5分)
9. 数据加载完成后刷新适配器(5分)
10. 要求:
项目名称命名规范,姓名+时间,例:张三,项目名称为-Zhangsan20171113,项目包名为com.bwie.姓名全拼(5分),功能代码模块中加入注释。(5分)
MainActivity
package com.bwei.lifangxin20171113;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.google.gson.Gson;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
/**
* 1. 整体布局使用DrawerLayout(5分),DrawerLauout的抽屉页面包含上方的头像和下方的4个条目(5分)
*2.2,进入页面后,开启子线程,在子线程中调用网络请求获取数据(5分)
*/
public class MainActivity extends AppCompatActivity {
String urlstr="http://data.v.qq.com/videocms/getNewsvideoList.php?ref=pclient&appkey=6UkwV9DeHr9_PC&vsite=new_vshou&ename=new_vs_feature&report=web.news&_=1504358456351";
private DrawerLayout drawer;
private ListView dl_lv;
private ListView lv;
List<JavaBean.DataBean.ContentBean> list = new ArrayList<>();
String dlStr[] = {"客服热线","营业部网点","系统设置","换肤"};
private String s;
private List<JavaBean.DataBean.ContentBean> content;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//判断网络
// NetUtils.getNetType(this);
//使用butterKnife来注解控件;
//ButterKnife.bind(this);
//初始化布局和试图
initView();
//初始化DrawerLayout数据
initData();
//给Item设置点击事件 关闭侧滑
setListener();
//开启子线程,在子线程中调用网络请求获取数据
// startThread();
//为ListView添加适配器,传入解析后的数据(5分),重写自定义适配器的几个重要方法(5分)
adapter = new MyAdapter();
lv.setAdapter(adapter);
new MyAsyncTask().execute(urlstr);
//数据加载完成后刷新适配器(5分)
adapter.notifyDataSetChanged();
}
private void setListener() {
dl_lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//关闭drawer
drawer.closeDrawer(dl_lv);
}
});
}
private void initView() {
drawer = findViewById(R.id.drawer);
dl_lv = findViewById(R.id.dl_lv);
lv = findViewById(R.id.lv);
}
private void initData() {
ArrayList<String> lists = new ArrayList<>();
for (int i = 0 ; i <4 ; i++){
lists.add(dlStr[i]);
}
ArrayAdapter<String> stringArrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, lists);
dl_lv.setAdapter(stringArrayAdapter);
}
//去除json串的不合格
private String doStr(String str) {
String str1 = str.replace("content(","").replace(");","");
return str1;
}
class MyAsyncTask extends AsyncTask<String,Void,String> {
//子线程方法,进行联网操作
@Override
protected String doInBackground(String... strings) {
String s = strings[0];
//直接用工具类获取json
String netJson = NetUtils.getNetJson(s);
String replace = netJson.replace("content(", "").replace(");", "");
return replace;//返回给(前台方法,主线程方法onPostExecute)
}
//主线程方法,可以直接进行更新UI
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Gson gson = new Gson();
JavaBean javaBean = gson.fromJson(s, JavaBean.class);
JavaBean.DataBean data = javaBean.getData();
content = data.getContent();
list.addAll(content);
adapter.notifyDataSetChanged();
}
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
int itemViewType = getItemViewType(i);
switch (itemViewType){
case 0:
ViewHolder1 holder = null;
if(view==null){
holder = new ViewHolder1();
view = View.inflate(MainActivity.this, R.layout.lv_item, null);
holder.lv_tv1 = (TextView) view.findViewById(R.id.lv_tv1);
view.setTag(holder);
}else{
holder = (ViewHolder1) view.getTag();
}
holder.lv_tv1.setText(list.get(i).getSubtitle());
// ImageLoader.getInstance().displayImage(list.get(i).getPic_url(),holder.i);
break;
case 1:
ViewHolder2 holder2 = null;
if(view==null){
holder2 = new ViewHolder2();
view = View.inflate(MainActivity.this, R.layout.lv_item2, null);
holder2.lv_tv2 = (TextView) view.findViewById(R.id.lv_tv2);
holder2.lv_img2 = (ImageView) view.findViewById(R.id.lv_img2);
view.setTag(holder2);
}else{
holder2 = (ViewHolder2) view.getTag();
}
holder2.lv_tv2.setText(list.get(i).getTitle());
ImageLoader.getInstance().displayImage(list.get(i).getPic_url(),holder2.lv_img2);
break;
}
return view;
}
//重写适配器的多条目加载方法(5分)
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
String vplus_pic = content.get(position).getVplus_pic();
//根据vplus_pic的有无进行判断,返回两种类型(5分)
if(vplus_pic == null ){
return 0;
}else {
return 1;
}
}
}
class ViewHolder1{
TextView lv_tv1;
}
class ViewHolder2{
TextView lv_tv2;
ImageView lv_img2;
}
}