热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络加载数据到ListView

一:首先ListView的网络数据加载一直是难题在Android的学习过程中,因为设计到了各种回调方法以及包括Adapter、AsyncTask、网络加载、json数据的解析二:于是可

一:

    首先ListView的网络数据加载一直是难题在Android的学习过程中,因为设计到了各种回调方法以及包括Adapter、AsyncTask、网络加载、json数据的解析

二:

    于是可以分析得出需要构建以下几个包及其包含的类:

bean(包)--->Shop(用来封装json数据中的属性的,里面写的是构造函数和Getter和Setter)

utils(工具包)--->HttpUtils(工具类:用来将传入的String类型的网址转换成byte[]然后返回。)

utils(工具包)--->ParserJson(工具类:用来将传入的jsonString字符串转换成list的list集合返回)

AsyncTask(异步任务包)---->DownLoadAsyncTask(用来进行耗时操作的.其中两个方法doInBackground是将传入的

api接口的网址,通过网络解析工具类HttpUtils得到一个bye[]数组,再将byte[]数组通过:

byte[] buff=HttpUils.getHttpResult(params[0]);
String jsOnString=new String(buff,0,buff.length);


即可以得到:一个json解析后的list集合。再将list回传。在onPostExecute方法中,将list集合进行适配器的适配,所以需要构建一个Adapter了。

adapter(工具包)--->MyBaseAdapter(继承自baseAdapter,在其中有四个方法,最为重要的是getView方法,在这个方法中需要注意的是,首先需要对holder的属性进行实例化,调用方法为LayoutInflater,然后再setTag(holder),再需要进行的是将文字和图片set到item里面,由于需要用将图片下载进行set,所以需要再开启一个异步任务LoadImageAsyncTask,然后返回convertView

AsyncTask(异步任务包)---->LoadImageAsyncTask(用来将传入的图片的网址转换成图片进行回传到MyBaseAdapter里面,所以需要将数据回传,构建一个CallBack的回调函数,将得到的bitmap图片回传到MyBaseAdapter。

----然后DownLoadAsyncTask在onPostExecute方法中传入一个listView的实例化对象lv,进行lv.setAdapter(adapter);

----再在主函数中进行最后一步即可,开启DownLoadAsyncTask异步任务。


即有代码:

在MainActivity中:

package com.example.administrator.firstapp;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

import asyncTask.DownloadAsyncTask;
import bean.Shop;

public class MainActivity extends AppCompatActivity {
private ListView lv;
private List list=new ArrayList();
private String path="http://moblist.baobeigezi.com/v26/m_recommend_product/get_hot_sale_list?page=1&category_id=28&size=15&sign=c06c5b87a9db0a907774f1a094eee819&session_id=&v=2.6.9&c=AppStore&agent=ios&local_cart_id=838618F5-24B3-4356-904D-";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv= (ListView) findViewById(R.id.lv);

new DownloadAsyncTask(this,list,lv).execute(path);
}
}
在adapter中:

package adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.example.administrator.firstapp.R;

import java.util.List;

import asyncTask.LoadImageAsyncTask;
import bean.Shop;
import utils.HttpUtils;

/**
* Created by Administrator on 2016/8/22.
*/
public class MyBaseAdapter extends BaseAdapter {
private Listlist;
private Context context;
private ListView lv;

public MyBaseAdapter(List list, Context context,ListView lv) {
this.list = list;
this.cOntext= context;
this.lv=lv;
}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
return position;
}
ViewHolder holder=new ViewHolder();

public View getView(int position, View convertView, ViewGroup parent) {
if (cOnvertView==null){

LayoutInflater layoutInflater=LayoutInflater.from(context);
cOnvertView=layoutInflater.inflate(R.layout.activity_item_last,null);
holder.iv= (ImageView) convertView.findViewById(R.id.iv_image_url);
holder.tv_market_price= (TextView) convertView.findViewById(R.id.tv_market_price);
holder.tv_store_price= (TextView) convertView.findViewById(R.id.tv_store_price);
holder.tv_name= (TextView) convertView.findViewById(R.id.tv_name);
convertView.setTag(holder);
}
else {
holder= (ViewHolder) convertView.getTag();
}
holder.tv_name.setText(list.get(position).getName());
holder.tv_store_price.setText(list.get(position).getMarket_price());
holder.tv_market_price.setText(list.get(position).getMarket_price());
new LoadImageAsyncTask(context, new LoadImageAsyncTask.CallBack() {
@Override
public void sendImage(Bitmap bm) {
holder.iv.setImageBitmap(bm);
}
}).execute(list.get(position).getImage_url());

return convertView;
}
static class ViewHolder{
ImageView iv;
TextView tv_market_price,tv_store_price,tv_name;
}
}

DownLoadAsyncTask中:

package asyncTask;

import android.content.Context;
import android.os.AsyncTask;
import android.widget.ListView;
import android.widget.Toast;

import java.util.List;

import adapter.MyBaseAdapter;
import bean.Shop;
import utils.HttpUtils;
import utils.ParserJson;

/**
* Created by Administrator on 2016/8/22.
*/
public class DownloadAsyncTask extends AsyncTask> {
private Context context;
private List list;
private ListView lv;

public DownloadAsyncTask(Context context, List list, ListView lv) {
this.cOntext= context;
this.list = list;
this.lv = lv;
}

@Override
protected List doInBackground(String... params) {
if (HttpUtils.isNetWork(context)){
byte[] buff=HttpUtils.getHttpResult(params[0]);
String jsOnString= new String(buff,0,buff.length);
list=ParserJson.parserJsonToList(jsonString);
}
return list;
}

@Override
protected void onPostExecute(List result) {
if (result!=null&&result.size()!=0){
list.addAll(result);
MyBaseAdapter adapter=new MyBaseAdapter(list,context,lv);
lv.setAdapter(adapter);
}
else {
Toast.makeText(context, "下载异常", Toast.LENGTH_SHORT);
}
}
}

LoadImageAsyncTask中:


package asyncTask;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;

import utils.HttpUtils;

/**
* Created by Administrator on 2016/8/22.
*/
public class LoadImageAsyncTask extends AsyncTask {
private Context context;
private byte[] buff;
private CallBack cb;
private Bitmap bit;

public LoadImageAsyncTask(Context context,CallBack cb) {
this.cOntext= context;
this.cb = cb;

}

@Override
protected byte[] doInBackground(String... params) {
if (HttpUtils.isNetWork(context)){
buff =HttpUtils.getHttpResult(params[0]);
Log.i("TAG",buff.toString());
}
return buff;
}

@Override
protected void onPostExecute(byte[] result) {
if(result!=null&&result.length!=0){
Bitmap bm =BitmapFactory.decodeByteArray(result,0,result.length);
cb.sendImage(bm);
}
}
public interface CallBack{
public void sendImage(Bitmap bm);
}
}

在Shop中:

package bean;

/**
* Created by Administrator on 2016/8/22.
*/
/*{
"code": 1,
"msg": "成功!",
"data": {
"product_list": [
{
"product_id": "29532",
"market_price": "336.00",
"store_price": "145.00",
"name": "【包邮包税】新西兰A2 Platinum酪蛋白婴儿3段奶粉(1-3周岁宝宝)900g 【保质期2018年3月】",

"image_url": "http://image.baoimg.net/photo/201606/2016061310003240007625.jpg",*/

public class Shop {
private String market_price;
private String store_price;
private String name;
private String image_url;

public Shop(String market_price, String store_price, String name, String image_url) {
this.market_price = market_price;
this.store_price = store_price;
this.name = name;
this.image_url = image_url;
}

public String getMarket_price() {
return market_price;
}

public void setMarket_price(String market_price) {
this.market_price = market_price;
}

public String getStore_price() {
return store_price;
}

public void setStore_price(String store_price) {
this.store_price = store_price;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getImage_url() {
return image_url;
}

public void setImage_url(String image_url) {
this.image_url = image_url;
}
}


在工具类 HttpUtils中:


package utils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
* Created by Administrator on 2016/8/21.
*/
public class HttpUtils {
public static boolean isNetWork(Context context){
ConnectivityManager manager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info=manager.getActiveNetworkInfo();
if (info!=null){
return info.isConnected();
}
else {
return false;
}
}
public static byte[] getHttpResult(String path){
ByteArrayOutputStream os=new ByteArrayOutputStream();
try {
URL url=new URL(path);
HttpURLConnection cOnn= (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
int respOnseCode=conn.getResponseCode();
if(respOnseCode==200){
InputStream in=conn.getInputStream();
int temp=0;
byte[] buff=new byte[1024];
while ((temp=in.read(buff))!=-1){
os.write(buff,0,temp);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return os.toByteArray();
}
}

在工具类 ParserJson中:

package utils;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

import bean.Shop;

/**
* Created by Administrator on 2016/8/22.
*/
/*{
"code": 1,
"msg": "成功!",
"data": {
"product_list": [
{
"product_id": "29532",
"market_price": "336.00",
"store_price": "145.00",
"name": "【包邮包税】新西兰A2 Platinum酪蛋白婴儿3段奶粉(1-3周岁宝宝)900g 【保质期2018年3月】",

"image_url": "http://image.baoimg.net/photo/201606/2016061310003240007625.jpg",*/

public class ParserJson {
public static List parserJsonToList(String jsonString){
List list= new ArrayList();
try {

JSONObject jsOnObject=new JSONObject(jsonString);
JSONObject object=jsonObject.getJSONObject("data");
JSONArray jsOnArray=object.getJSONArray("product_list");
for (int i=0;i JSONObject obj=jsonArray.getJSONObject(i);
String market_price=obj.getString("market_price");
String store_price=obj.getString("store_price");
String name=obj.getString("name");
String image_url=obj.getString("image_url");
Shop shop=new Shop(market_price,store_price,name,image_url);
list.add(shop);
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
}














推荐阅读
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 本文探讨了如何利用 Android 的 Movie 类来展示 GIF 动画,并详细介绍了调整 GIF 尺寸以适应不同布局的方法。同时,提供了相关的代码示例和注意事项。 ... [详细]
  • 本文探讨了在已知最终数组尺寸不会超过5000x10的情况下,如何利用预分配和调整大小的方法来优化Numpy数组的创建过程,以提高性能并减少内存消耗。 ... [详细]
  • 本文探讨为何Request对象的外观设计被认为是精妙的,重点在于其如何利用门面模式确保数据安全,同时保持系统的高效交互。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • Java多线程售票案例分析
    本文通过一个售票系统的实例,深入探讨了Java中的多线程技术及其在资源共享和并发控制中的应用。售票过程涉及查询、收款、找零和出票等多个步骤,其中对总票数的管理尤为关键。 ... [详细]
  • WebBenchmark:强大的Web API性能测试工具
    本文介绍了一款名为WebBenchmark的Web API性能测试工具,该工具不仅支持HTTP和HTTPS服务的测试,还提供了丰富的功能来帮助开发者进行高效的性能评估。 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 最近遇到了一个关于单链表的编程问题,这是来自福富公司的笔试题目。以往我通常使用C语言来解决这类问题,但这次决定尝试用Java来实现。该题目要求实现一个单链表,并完成特定的方法。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 在使用 PyInstaller 将 Python 应用程序打包成独立的可执行文件时,若项目中包含动态加载的库或插件,需要正确配置 --hidden-import 和 --add-binary 参数,以确保所有依赖项均能被正确识别和打包。 ... [详细]
  • 数据输入验证与控件绑定方法
    本文提供了多种数据输入验证函数及控件绑定方法的实现代码,包括电话号码、数字、传真、邮政编码、电子邮件和网址的验证,以及报表绑定和自动编号等功能。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
author-avatar
爱电影麦兜兜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有