[Android学习系列16]Android把php输出的json加载到listview

首先写个php脚本输出json,注意,还要输出回车,方便android的bufferreader读取一行

<?php

class Book {
public $bookid;
public $bookname;
public $bookinfo;

function __construct($id,$name,$info ){
$this->bookid = $id;
$this->bookname = $name;
$this->bookinfo = $info;
}
}

$book1 = new Book("1","高等数学","一本好书");
$book2 = new Book("2","呵呵呵呵","一本好书");
$book3 = new Book("3","哈哈哈哈","一本好书");

//把对象转成json 输出
echo json_encode($book1);
echo "\r\n";
echo json_encode($book2);
echo "\r\n";
echo json_encode($book3);
echo "\r\n";

?>

然后在android的客户端,用子线程发送http请求获取数据,然后发消息给主线程的handler更新listview

listview的一行的样式  one_item.xml  :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/textview"
android:gravity="center"
android:textColor="#000000"
android:layout_width="fill_parent"
android:layout_height="30dp"/>

</LinearLayout>

activity的java代码:

//搞了我半天,整个流程应该是这样的
//因为http获取json的数据 写到一个新线程里 new thread ( runnableUi )
//在新线程runnableUi里,有一个initDataAndAdapter() 用来获得网络数据 放进listbook,获取完后发消息给 主线程的handler
//handler收到消息后, 把数据源listbook 传给 listview 的adapter (即更新主线程界面)

public class MainActivity extends Activity {

List<Book> listBook;
ListView listView;

// 构建Runnable对象,在runnable中更新界面
Runnable runnableUi = new Runnable(){
@Override
public void run() {

initDataAndAdapter();
}

};

//主线程的handler, http请求获得数据后 会调用这个主线程的handler 来修改主线程界面(绑定listview的adapter)
Handler handler = new Handler(){

public void handleMessage(Message msg) {

//在主线程的handler里 修改listview的适配器
listView.setAdapter(new MyListAdapter(getApplicationContext(), listBook ));

};

};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView = (ListView)findViewById(R.id.listView1);
listBook = new ArrayList<Book>();

new Thread( runnableUi ).start();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

public void initDataAndAdapter() {

HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://taobibi.kuphp.net/");
Book book;

try {

HttpResponse httpResponse = httpClient.execute(httpGet);
BufferedReader bufferReader = new BufferedReader( new InputStreamReader( httpResponse.getEntity().getContent() ) );

for(String s = bufferReader.readLine(); s != null; s = bufferReader.readLine())
{
//每行为一个json对象
JSONObject jsonObject = new JSONObject( s );
Log.v("mytag", s);

//然后放进book对象
book = new Book();
book.bookId = jsonObject.getString("bookid");
book.bookName = jsonObject.getString("bookname");
book.bookInfo = jsonObject.getString("bookinfo");

//然后把book放进list
listBook.add(book);

}

} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//数据全都接收到listView以后,发消息给主线程里面的handler,让他去修改listview 的 setadapter
handler.sendEmptyMessage(0);

}

class Book {
String bookId;
String bookName;
String bookInfo;
}

class MyListAdapter extends BaseAdapter {

Context context;
List<Book> listBook;

MyListAdapter(Context con , List<Book> list ) {
this.context = con;
listBook = (ArrayList<Book>)list;

}

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

@Override
public Object getItem(int arg0) {
return arg0;
}

@Override
public long getItemId(int arg0) {
return arg0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

LayoutInflater inflator = LayoutInflater.from(context);
View oneView = inflator.inflate(R.layout.one_item, null);
TextView textView = (TextView)oneView.findViewById(R.id.textview);

String str = listBook.get(position).bookId + " " + listBook.get(position).bookName + " " + listBook.get(position).bookInfo;
textView.setText( str );

return oneView;
}

}

}


View
Code

参考:

解决NetworkOnMainThreadException

http://www.aitinan.com/4387.html

Android访问php取回json数据

http://www.oschina.net/code/snippet_12_1122

http://blog.csdn.net/djx123456/article/details/6325983

[Android学习系列16]Android把php输出的json加载到listview,布布扣,bubuko.com

时间: 2024-10-19 03:26:53

[Android学习系列16]Android把php输出的json加载到listview的相关文章

[Android学习系列15]下拉刷新列表实现动态加载

使用google官方的SwipeRefreshLayout 参考: http://blog.csdn.net/easyer2012/article/details/22857807 http://stormzhang.github.io/android/2014/03/29/android-swiperefreshlayout/ http://www.eoeandroid.com/thread-330439-1-1.html http://www.oschina.net/translate/sw

Android学习系列(39)--Android主题和样式之系统篇(上)

Android学习系列(39)--Android主题和样式之系统篇(上) [基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计是最基础和非常有必要的.android ui设计最重要的就是主题和样式. 1.位置在Android的frameworks/base/core/res/res/values目录下有一下几个文件: 1 2 3 4 themes.x

Android学习系列(41)--Android Studio简单使用

1. 环境 UBUNTU 14.04 + Android Studio 0.8.2 2. 安装jdk openjdk-7是一个很好的选择: sudo apt-get update sudo apt-get install openjdk-7-jdk 不排除你需要选择一个默认版本: sudo update-alternatives --config java sudo update-alternatives --config javac 3. 安装Android Studio 在UBUNTU有两种

【转】Android学习系列(39)--Android主题和样式之系统篇(上)

[基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计是最基础和非常有必要的.android ui设计最重要的就是主题和样式. 1.位置在Android的frameworks/base/core/res/res/values目录下有一下几个文件: 1 2 3 4 themes.xml themes_device_defaults.xml styles.

Android学习系列(40)--Android主题和样式之系统篇(下)

Widget样式(Widget Style) 特别说明,此处定义大量的系统内置控件的样式,对于重写原生控件的样式具有很大的参考价值. <!-- Widget styles --> <item name="absListViewStyle">@android:style/Widget.AbsListView</item> <item name="autoCompleteTextViewStyle">@android:st

Spring Boot 学习系列(09)—自定义Bean的顺序加载

此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServiceBean和OrderServiceBean,我们需要在OrderServiceBean中调用UserServiceBean,获取其提供的一些数据信息.针对这一场景,通常来说,有这么几种方式: 1.将UserServiceBean封装成一个服务类(如采用@Service注解),然后在OrderS

Android学习系列(17)--App列表之圆角ListView(续)

http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜.上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快

【转】Android学习系列(1)--为App签名(为apk签名)

原文网址:http://www.cnblogs.com/qianxudetianxia/archive/2011/04/09/2010468.html Android学习系列(1)--为App签名(为apk签名) 写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,博客园就是这样的舞台.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Pack

Android学习系列(7)--App轮询服务器消息

这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率设置,要在需求和性能中平衡. 2.独立进程     无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务.     我们需要一个独立进程的后台服务.     在AndroidManifest.xml中注册Service时,有一个android:process属性,如果这个属性以