Android 实现json网络数据通过BaseAdapter加载到ListView中

效果图,有点没有设计美感,哈哈,凑合着看吧

这里写图片描述

关于json,我对json有一定的了解,所以这个项目我用自己构建的服务器输出json数据,文件名json.php
php代码如下

<?php 
$json="{'data':1,'students':[{'name':'张三','age':22,'url':'http://192.168.1.103/pictures/pic1.jpg'},{'name':'李四','age':23,'url':'http://192.168.1.103/pictures/pic2.jpg'},{'name':'王五','age':26,'url':'http://192.168.1.103/pictures/pic3.jpg'},{'name':'刘流','age':32,'url':'http://192.168.1.103/pictures/pic4.jpg'},{'name':'陈曦','age':22,'url':'http://192.168.1.103/pictures/pic5.jpg'}]}"; 
echo $json; 
?>

Android文件目录图:

这里写图片描述

Android配置页AndroidMenifests.xml代码如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.imooc.capton.json">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.imooc.capton.json.MainActivity">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>


</RelativeLayout>

student.xml

<?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:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="180dp"
        android:layout_height="120dp"
        android:src="@mipmap/ic_launcher"
        android:layout_gravity="center"
        android:id="@+id/imageView" />

    <LinearLayout
        android:orientation="vertical"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:text="TextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20dp" 
            android:id="@+id/name" />

        <TextView
            android:text="TextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/age" />
    </LinearLayout>
</LinearLayout>

MainActivity.java

package com.imooc.capton.json;

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

public class MainActivity extends AppCompatActivity {
    Context context=this;
    ListView listView;
    Handler handler;
    JsonAdapter jsonAdapter;
    String url="http://192.168.1.103/json.php";//这个url随你设置的php页面而变动。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView= (ListView) findViewById(R.id.listview);
        handler=new Handler();//获得一个handler对象,为后面的各个线程提供处理UI的依据
        new JsonThread(context, listView, url,handler).start();
    }
}

JsonThread.java

package com.imooc.capton.json;

import android.content.Context;
import android.os.Handler;
import android.widget.ListView;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by CAPTON on 2016/11/25.
 */
//访问目标网址,得到json数据,保存List<Student>数据,等待传入JsonAdapter
public class JsonThread extends Thread {
    Context context;
    ListView listView;
    String url;
    Handler handler;//关键参数 整个小项目中的核心之一,会在JsonThread和JsonAdapter,ImageThread中传递,用于更新UI界面
    List<Student> students;
    JsonAdapter jsonAdapter;

    public JsonThread(Context context, ListView listView, String url,Handler handler ) {
        this.context=context;
        this.listView=listView;
        this.url=url;
        this.handler=handler;
    } 
    //从String中解析所需数据,如name,age,url,将他们装入Student中,再将Student逐条加入List<Student>中
    private  List<Student> getStudents(String data){
        List<Student> students=new ArrayList<Student>();
        try {
            JSONObject object=new JSONObject(data);
            if(object.getInt("data")==1){
                JSONArray jsonArray=object.getJSONArray("students");
                for(int i=0;i<jsonArray.length();i++){
                    JSONObject studentObject= (JSONObject) jsonArray.get(i);
                    Student student=new Student();
                    student.name=studentObject.getString("name");
                    System.out.println(student.name);
                    student.age=studentObject.getInt("age");
                    System.out.println(student.age);
                    student.url=studentObject.getString("url");
                    System.out.println(student.url);
                    students.add(student);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        } 
        return  students;
    }

    @Override
    public void run() {

        //从网络中获取数据,转换为String类型
        StringBuffer result=new StringBuffer();
        try {
            URL Url=new URL(url);
            HttpURLConnection connection= (HttpURLConnection) Url.openConnection();
            connection.setRequestMethod("GET");
            connection.setReadTimeout(5000);
            InputStream inputStream=connection.getInputStream();
            BufferedReader bufferedReader=new BufferedReader(new   InputStreamReader(inputStream));
            String line;
            while ((line=bufferedReader.readLine())!=null){
                result.append(line);
            }
            System.out.println(result);
            students=getStudents(result.toString());//调用解析方法
            inputStream.close();
            bufferedReader.close();

            handler.post(new Runnable() {
                @Override
                public void run() {

                    jsonAdapter=new JsonAdapter(context,handler,students); //传递关键参数MainActivity上下文对象context,MainActivity主线程的handler对象,处理好的List<Student>对象
                    listView.setAdapter(jsonAdapter);
                }
               }); 
           } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
        super.run();
    } 
}

JsonAdapter.java

package com.imooc.capton.json;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
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 java.util.List;

/**
 * Created by CAPTON on 2016/11/25.
 */
// 适配器,等待被JsonThread调用

public class JsonAdapter extends BaseAdapter {

    List<Student> students;
    Context context;
    LayoutInflater inflater;
    Handler handler;

    public JsonAdapter(Context context,Handler handler,List<Student> students) {
        this.handler=handler;
        this.context=context;
        this.students=students;
        inflater=LayoutInflater.from(context);//从MainActivity中上下文对象中获取LayoutInflater;所以说这个context,和handler对象很重要,贯穿整项目
    }

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

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

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

    //重写getView方法,即设置ListView每一项的视图
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder=null;

       if(convertView==null){
           convertView=inflater.inflate(R.layout.student,null);
           holder=new ViewHolder(convertView);
           convertView.setTag(holder);//设置tag
       }else {
           holder= (ViewHolder) convertView.getTag(); //获取tag
       }
        System.out.println(String.valueOf(students.get(position).age));//测试数据是否正常
        holder.age.setText(String.valueOf(students.get(position).age));
        holder.name.setText(students.get(position).name);
        System.out.println(students.get(position).name);
        new ImageThread(students.get(position).url, handler,holder.image).start();//开启新线程下载图片并在新线程中更新UI,所以要传递handler对象
        return convertView;
     }

//用于暂时保存视图对象
     class ViewHolder{
         public TextView name;
         public TextView age;
         public ImageView image;

          public ViewHolder(View view){
              name= (TextView) view.findViewById(R.id.name);
              age= (TextView) view.findViewById(R.id.age);
              image= (ImageView) view.findViewById(R.id.imageView);
          } 
     }
}

ImageThread.java

package com.imooc.capton.json;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.widget.ImageView;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

/**
 * Created by CAPTON on 2016/11/25.
 */
//根据url读取图片数据,把图片Bitmap保存下来等待 JsonAdapter调用

public class ImageThread extends Thread {
    String url;
    ImageView imageView;
    Handler handler;
    public ImageThread(String url, Handler handler,ImageView imageView) {
        this.url = url;
        this.imageView=imageView;
        this.handler=handler;
    }


    @Override
    public void run() {
        try {
            final Bitmap bitmap= BitmapFactory.decodeStream(new URL(url).openStream());//简单粗暴,可能有问题,自己做的时候注意
            handler.post(new Runnable() {
                @Override
                public void run() { 
                    imageView.setImageBitmap(bitmap);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        } 
        super.run();
    }
}

Student.java

package com.imooc.capton.json;

/**
 * Created by CAPTON on 2016/11/25.
 */
// bean数据
public class Student { 
    public String name;
    public String url;
    public int age; 
}

到此整个项目代码如上,根据慕课网nate老师的视频教程纯手打实现,感觉比他的代码要简洁一些,毕竟没有源码,鄙人在此献上代码,欢迎各位指导评论

猜你喜欢

转载自blog.csdn.net/ccapton/article/details/53339562
今日推荐