• Android获取服务器Json字符串并显示在ListView上面


    已经好久没有更新博客,今天终于有新的东西可以记录了。

    通过这次的任务学习到了以前没有注意到的知识点,真的有种书读百遍,其义自见的感觉。这次又重新认识了《Handler消息机制原理》。这次的任务中有更新UI。但是忘记了在Android4.0以后不能在UI线程访问网络,子线程也不能更新UI界面。下面我来展示一下这次的效果图。

    这次的任务是:获取服务器端的json字符串,并解析显示在Android界面上。

    当我接到这个任务的时候,首先想到的是利用Fragment布局加上ListView布局。但是因为没有完全掌握,所以失败了。这是就想到了现在的方案。利用GridView加上ListView来实现。布局是没有问题。但是写代码的时候却出现了问题。当我获取到数据并顺利解析的时候。却怎么也传不到ListView。总是显示它的size为0.但是通过打印确实获取到了。这个时候老师让我利用Handler,便能顺利解决问题了。原因就是一开始,我写到的不能在子线程更新UI。

    下面我来粘出我的代码以供大家参考:

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" 
        android:background="@drawable/set_bj">
     <GridView 
            android:id="@+id/gv_icons"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:numColumns="4"
            android:layout_alignParentBottom="true">
            
        </GridView>
    </RelativeLayout>

    item_gridview.xml

    <?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="match_parent"
        android:padding="10dp">
        
    <TextView 
        android:id="@+id/tv_icons"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="功能"
        android:layout_centerInParent="true"
        android:textSize="13sp"
        android:textColor="#000000"/>
    
    </RelativeLayout>

    activity_select.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" >
     <LinearLayout 
         android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:orientation="horizontal">
             <TextView 
          android:id="@+id/tv_id"
          android:layout_width="0dp"
          android:layout_weight="2"
          android:textColor="@android:color/black"
          android:layout_height="wrap_content"
          
          android:textSize="15sp"
          android:text="题号"/>  
            <TextView 
          android:id="@+id/tv_name"
           android:layout_width="0dp"
          android:layout_weight="1"
    
          android:layout_height="wrap_content"
          android:textSize="15sp"
          android:text="题目"/> 
            <TextView 
          android:id="@+id/tv_tech"
           android:layout_width="0dp"
          android:layout_weight="7"
          android:gravity="center"
          android:layout_height="wrap_content"
          android:textSize="15sp"
          android:text="要求"/> 
          
     </LinearLayout>
    
         <ListView 
             android:id="@+id/lv"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginLeft="5dp">
         </ListView>  
    
    </LinearLayout>

    item_listview.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="horizontal" >
                  <TextView 
          android:id="@+id/tv_id"
          android:layout_width="0dp"
          android:layout_weight="1"
          android:textColor="@android:color/black"
          android:layout_height="wrap_content"
          android:gravity="center"
          android:text="题号"/>  
            <TextView 
          android:id="@+id/tv_name"
           android:layout_width="0dp"
          android:layout_weight="3"
          android:gravity="center"
          android:layout_height="wrap_content"
          android:text="题目"/> 
            <TextView 
          android:id="@+id/tv_tech"
           android:layout_width="0dp"
          android:layout_weight="6"
          android:gravity="center"
          android:layout_height="wrap_content"
          android:text="要求"/> 
          
    
    </LinearLayout>

    MainActivity.java

    package com.rjxy.student;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.BaseAdapter;
    import android.widget.GridView;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
        private GridView gv_Home;
        private String[] settingText = {"全部题目","我的选题","个人信息","我的密码"};
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            gv_Home = (GridView) findViewById(R.id.gv_icons);
            gv_Home.setAdapter(new MyAdapter());
            gv_Home.setOnItemClickListener(new OnItemClickListener() {
            
                @Override
                public void onItemClick(AdapterView<?> adapter, View view, int position,
                        long id) {
                    System.out.println(position);
                    switch (position) {
                    case 0:
                        //查看全部题目
                        
                        Intent intent = new Intent(MainActivity.this,SetlectActivity.class);
                        startActivity(intent);
                        break;
                    case 1:
                        //我的选题
                        break;
                    case 2:
                        //个人信息
                        break;
                    case 3:
                        //修改密码
                        break;
                    default:
                        
                        break;
                    }
                    
                }
    
                
            });
        }
    
    class MyAdapter extends BaseAdapter{
    
        @Override
        public int getCount() {
            
            return settingText.length;
        }
    
        @Override
        public Object getItem(int position) {
            
            return settingText[position];
        }
    
        @Override
        public long getItemId(int position) {
            
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = View.inflate(getApplicationContext(), R.layout.item_gridview, null);
            TextView tv_Home = (TextView) view.findViewById(R.id.tv_icons);
            tv_Home.setText(settingText[position]);
            return view;
        }
        
    }
       
    }

    SetlectActivity.java

    package com.rjxy.student;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.StatusLine;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    
    public class SetlectActivity extends Activity {
        private static final int CHANGE_UI = 1;
        private static final int ERROR = 2;
        private ListView lv;
        private List<Data> datas = new ArrayList<Data>();
        //主线程创建消息处理器
        private Handler handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                if (msg.what == CHANGE_UI) {
                    try {
                        JSONArray arr = new JSONArray((String)msg.obj);  
                          for (int i = 0; i < arr.length(); i++) {   
                              JSONObject temp = (JSONObject) arr.get(i); 
                             // Log.d("json", temp.getInt("id")+temp.getString("exp_name")+temp.getString("exp_tech"));
                              Data data = new Data();                              
                              data.setId(temp.getInt("id"));                     
                              data.setExp_name(temp.getString("exp_name"));
                              data.setExp_tech(temp.getString("exp_tech"));                          
                             //这个地方可以获取到值但是适配器那位0
                              datas.add(data);
                             
                              
                          }
                          lv.setAdapter(new MyAdapter());
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } 
                }
            };
        };
            
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_select);
            lv = (ListView) findViewById(R.id.lv);
            select();
            
            
            
            
        }
        
            
            
    
        private void select(){
            //子线程更新UI
             new Thread(){
                    public void run(){
                        StringBuilder builder = new StringBuilder();
                        HttpClient client = new DefaultHttpClient();
                        String path = "http://10.6.78.254:2016/xampp/graduate/index.php/home/Student/test_android";        
                        HttpGet httpGet = new HttpGet(path);
                        try {
                        HttpResponse response = client.execute(httpGet);
                        StatusLine statusLine = response.getStatusLine();
                        int statusCode = statusLine.getStatusCode();
                        if (statusCode == 200) {
                            
                            
                          BufferedReader reader = new BufferedReader
                                      (new InputStreamReader(response.getEntity().getContent(),"UTF-8"));
                              for(String s=reader.readLine();s!=null;s=reader.readLine())
                              {
                                  builder.append(s);
                              }
                              String content = builder.toString();
                            //通知主线程更新UI
                              Message message = new Message();
                              message.what = CHANGE_UI;
                              message.obj = content;
                              handler.sendMessage(message);
                        }else{
                            Log.e(MainActivity.class.toString(), "Failed");
                        }
                    } catch (ClientProtocolException e) {
                        
                        e.printStackTrace();
                    } catch (IOException e) {
                        
                        e.printStackTrace();
                    }
                        
                        
                    };
                }.start();
        }
         class MyAdapter extends BaseAdapter{
    
                @Override
                public int getCount() {
                    Log.d("AAA", ""+datas.size());        
                    return datas.size();
                    
                        
                }
    
                @Override
                public Object getItem(int position) {
            
                    return datas.get(position);
                }
    
                @Override
                public long getItemId(int position) {
                    
                    return position;
                }
                
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    View view = View.inflate(SetlectActivity.this, R.layout.item_listview, null);
                    TextView id = (TextView) view.findViewById(R.id.tv_id);
                    TextView exp_name = (TextView) view.findViewById(R.id.tv_name);
                    TextView exp_tech = (TextView) view.findViewById(R.id.tv_tech);
                    Data data = datas.get(position);
                    Log.d("aaaaa",datas.get(position).getExp_name() );
                    
                    id.setText(String.valueOf(datas.get(position).getId()));
                    exp_name.setText(datas.get(position).getExp_name());
                    //Log.i("exp_name", datas.get(position).getExp_name());
                    exp_tech.setText(datas.get(position).getExp_tech());            
                    return view;
                }
                
         }
    }

    Data.java

    package com.rjxy.student;
    
    public class Data {
        private int id;
        private String exp_name;
        private String exp_tech;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getExp_name() {
            return exp_name;
        }
        public void setExp_name(String exp_name) {
            this.exp_name = exp_name;
        }
        public String getExp_tech() {
            return exp_tech;
        }
        public void setExp_tech(String exp_tech) {
            this.exp_tech = exp_tech;
        }
        @Override
        public String toString() {
            return "Data [id=" + id + ", exp_name=" + exp_name + ", exp_tech="
                    + exp_tech + "]";
        }
        
    }

    添加权限:

    <uses-permission android:name="android.permission.INTERNET"/>

     服务器端的代码:ThinkPHP代码为:

    public function test_android(){
            
            $myModel = new ThinkModel();
            $result=$myModel->query("select id,exp_name,exp_tech from g_experiment ;");
            
            echo json_encode($result);
        
        }
  • 相关阅读:
    基于NPOI的报表引擎——ExcelReport
    XML数据源快速开发框架——XmlFramwork
    SqlExcel使用文档及源码
    第三篇:属性_第二节:控件属性在页面及源码中的表示方式
    第三篇:属性_第一节:控件属性与属性的持久化
    第二篇:呈现内容_第四节:个性化自定义控件
    第二篇:呈现内容_第三节:CompositeControl呈现
    Web用户控件开发--星型评分控件
    iOS 统计Xcode整个工程的代码行数
    iOS开发中的火星坐标系及各种坐标系转换算法
  • 原文地址:https://www.cnblogs.com/kangyaping/p/5886728.html
Copyright © 2020-2023  润新知