【问题标题】:Android Blank ListView - pulling from external SQL databaseAndroid 空白 ListView - 从外部 SQL 数据库中提取
【发布时间】:2017-03-22 05:04:25
【问题描述】:

我正在开发一个 Android Studio 应用程序,需要使用 php 从外部 SQL 数据库中的表中提取信息并将其显示在 ListView 中。代码没有显示任何错误,但 ListView 运行时屏幕上什么也没有显示。

这就是我所引用的:http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

HomePage.Java(这是应用程序的主屏幕,这是 ListView 所在的屏幕)

package com.example.marlo.myapplication;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

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

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;



public class HomePage extends AppCompatActivity {

// the variables with the et in front are for registration
// the others are for signing in

    private String TAG = MainActivity.class.getSimpleName();
    private ListView lv;
    ArrayList<HashMap<String, String>> databaseList;


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

        final ImageButton facilitiesHome = (ImageButton) findViewById(R.id.facilitiesIcon);
        final ImageButton activity_activities = (ImageButton) findViewById(R.id.activitiesIcon);
        final ImageButton trackersIcon = (ImageButton) findViewById(R.id.trackersIcon);

        final Button newEntry = (Button) findViewById(R.id.bNewEntry);

        final ListView lv = (ListView) findViewById(R.id.databaseItems);

        databaseList = new ArrayList<>();

// bottom bar, facilities home page
        facilitiesHome.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent createFacilitiesHomeIntent = new Intent(HomePage.this, FacilitiesHome.class);
                HomePage.this.startActivity(createFacilitiesHomeIntent);
            }

        });

        //bottom bar, activities home page
        activity_activities.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent createActivitiesIconIntent = new Intent(HomePage.this, ActivitiesHome.class);
                HomePage.this.startActivity(createActivitiesIconIntent);
            }
//
        });

        //bottom bar, trackers home page
        trackersIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent createTrackerIconIntent = new Intent(HomePage.this, TrackerHome.class);
                HomePage.this.startActivity(createTrackerIconIntent);
            }
//
        });

        //New Entry short cut
        newEntry.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent createNewEntryIntent = new Intent(HomePage.this, NewEntry.class);
                HomePage.this.startActivity(createNewEntryIntent);
            }
//
        });

        //new HomePageActivity(this).execute();

    }

    private class HomePageActivity extends AsyncTask<Array, Void, Array> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();


        }

        @Override
        protected Array doInBackground(Array... arg0) {

            String link;
            //String data;
            //BufferedReader bufferedReader;
            Array result;

            //try {


                link = "http://cgi.soic.indiana.edu/~team19/home_page_no_mood.php";
                //URL url = new URL(link);

                HttpHandler sh = new HttpHandler();


                String jsonStr = sh.makeServiceCall(link);


                Log.e(TAG, "Response from database: " + jsonStr);

                //Array jsonArray = result;

                if (jsonStr != null) {
                    try {
                        JSONObject jsonObj = new JSONObject(jsonStr);

                        // Getting JSON Array node
                        JSONArray userdata = jsonObj.getJSONArray("userdata");

                        // looping through All Userdata
                        for (int i = 0; i < userdata.length(); i++) {
                            JSONObject c = userdata.getJSONObject(i);

                            String username = c.getString("username");
                            String email = c.getString("email");
                            String age = c.getString("age");
                            String sex = c.getString("sex");
                            String hobbies = c.getString("hobbies");
                            String interests = c.getString("interests");


                            // tmp hash map for single contact
                            HashMap<String, String> contact = new HashMap<>();

                            // adding each child node to HashMap key => value
                            contact.put("username", username);
                            contact.put("email", email);
                            contact.put("age", age);
                            contact.put("sex", sex);
                            contact.put("hobbies", hobbies);
                            contact.put("interests", interests);

                            // adding contact to contact list
                            databaseList.add(contact);
                        }
                    } catch (final JSONException e) {
                        Log.e(TAG, "Json parsing error: " + e.getMessage());
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(getApplicationContext(),
                                        "Json parsing error: " + e.getMessage(),
                                        Toast.LENGTH_LONG)
                                        .show();
                            }
                        });

                    }
                } else {
                    Log.e(TAG, "Couldn't get json from server.");
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "Couldn't get json from server. Check LogCat for possible errors!",
                                    Toast.LENGTH_LONG)
                                    .show();
                        }
                    });

                }

                return null;
            }

            @Override
            protected void onPostExecute(Array result) {
                super.onPostExecute(result);
                // Dismiss the progress dialog

                /**
                 * Updating parsed JSON data into ListView
                 * */
                ListAdapter adapter = new SimpleAdapter(
                        HomePage.this, databaseList,
                        R.layout.list_item, new String[]{"username", "email",
                        "age"}, new int[]{R.id.username,
                        R.id.email, R.id.age});

                lv.setAdapter(adapter);
            }

}

list_item.xml(这是列表项在 ListView 中的分解方式)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="@dimen/activity_horizontal_margin">

        <TextView
            android:id="@+id/username"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="2dip"
            android:paddingTop="6dip"
            android:textColor="@color/colorPrimaryDark"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/email"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="2dip"
            android:textColor="@color/colorAccent" />

        <TextView
            android:id="@+id/age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#5d5d5d"
            android:textStyle="bold" />
    </LinearLayout>

activity_main.xml(这是应该填充 ListView 的 xml 文件)

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

    <include layout="@layout/app_bar"

        />


    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:theme="?attr/actionBarTheme"
        android:minHeight="?attr/actionBarSize"
        android:id="@+id/bottomMenu"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/ic_facilities"
        android:id="@+id/facilitiesIcon"
        android:background="@null"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_alignTop="@+id/bottomMenu"
        android:onClick="facilitiesHome" />

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/ic_trackers"
        android:layout_marginLeft="34dp"
        android:layout_marginStart="34dp"
        android:id="@+id/trackersIcon"
        android:background="@null"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignTop="@+id/bottomMenu"
        android:onClick="trackersHome" />

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/ic_activities"
        android:layout_marginRight="34dp"
        android:layout_marginEnd="34dp"
        android:id="@+id/activitiesIcon"
        android:background="@null"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignTop="@+id/bottomMenu"
        android:onClick="activitiesHome" />

    <Button
        android:text="NEW ENTRY"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/bNewEntry"
        android:backgroundTint="#69f0ae"
        android:onClick="newEntry"
        android:layout_above="@+id/bottomMenu"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:text="recommended activities"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button2"
        android:layout_above="@+id/bNewEntry"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />



    <ListView
        android:id="@+id/databaseItems"
        android:inputType="textNoSuggestions"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/button2"
        android:layout_centerHorizontal="true" />


</RelativeLayout>

HttpHandler.java(这是Http Handler Class,大部分是从上面列出的源代码中复制过来的)

package com.example.marlo.myapplication;

import android.util.Log;

import java.io.BufferedInputStream;
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.ProtocolException;
import java.net.URL;

/**
 * Created by MARLO on 3/21/17.
 */

public class HttpHandler {

    private static final String TAG = HttpHandler.class.getSimpleName();

    public HttpHandler() {
    }

    public String makeServiceCall(String reqUrl) {
        String response = null;
        try {
            URL url = new URL(reqUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            // read the response
            InputStream in = new BufferedInputStream(conn.getInputStream());
            response = convertStreamToString(in);
        } catch (MalformedURLException e) {
            Log.e(TAG, "MalformedURLException: " + e.getMessage());
        } catch (ProtocolException e) {
            Log.e(TAG, "ProtocolException: " + e.getMessage());
        } catch (IOException e) {
            Log.e(TAG, "IOException: " + e.getMessage());
        } catch (Exception e) {
            Log.e(TAG, "Exception: " + e.getMessage());
        }
        return response;
    }

    private String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line).append('\n');
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
}

home_page_no_mood.php(这是连接数据库的php文件)

<?php

    $con = mysqli_connect("db.soic.indiana.edu", "caps16_team19", "capstoneteam19", "caps16_team19");
    if (mysqli_connect_errno($con))
{
    echo '{"query_result":"ERROR"}';
}

    $accountid = $_GET["acid"]

    $statement = mysqli_query($con, "SELECT a.username, a.email, a.dob, a.sex, a.hobbies, a.interests FROM account AS a WHERE a.acid = (SELECT max(a.acid))");

    $rows = '{"userdata": "["}';
    if($statement->num_rows > 0) {
    while($row = mysqli_fetch_array($statement))
    {
        $rows = $row;
    }
    } else {
        echo '{"query_result":"FAILURE"}';
    }
    $rows = '{"]"}';

    echo json_encode($rows);

?>

谢谢你

8:16 使用可模拟链接 logcat 运行:

03-22 08:16:20.226 3277-3277/?我/艺术:不延迟启用 -Xcheck:jni (已经开启)03-22 08:16:20.226 3277-3277/? W/art:意外的 CPU 使用默认值的 X86 变体:x86 03-22 08:16:20.245 3277-3284/? 我/艺术:调试器不再活动 03-22 08:16:20.245 3277-3284/? 我/艺术:启动阻塞 GC 仪器 03-22 08:16:20.344 3277-3277/? W / System:ClassLoader引用了未知路径: /data/app/com.example.marlo.myapplication-2/lib/x86 03-22 08:16:20.349 3277-3277/? I/InstantRun:启动 Instant Run 服务器 com.example.marlo.myapplication 03-22 08:16:20.896 3277-3305/? I/OpenGLRenderer:初始化 EGL,版本 1.4 03-22 08:16:20.896 3277-3305/? D/OpenGLRenderer:交换行为 1 03-22 08:16:20.897 3277-3305/? W/OpenGLRenderer:无法选择配置 EGL_SWAP_BEHAVIOR_PRESERVED,重试不... 03-22 08:16:20.897 3277-3305/? D/OpenGLRenderer:交换行为 0 03-22 08:16:28.309 3277-3277/com.example.marlo.myapplication W/IInputConnectionWrapper: 非活动 InputConnection 上的 finishComposingText 03-22 08:16:36.409 3277-3277/com.example.marlo.myapplication W/IInputConnectionWrapper: 非活动 InputConnection 上的 finishComposingText

【问题讨论】:

  • 先检查此链接上方的任何数据?
  • 您可以通过转到 mockable.io 并为您的请求设置模拟响应来为该 Web 服务 api 创建模拟,只需创建一个帐户,使用 json 响应设置 url 运行它,然后您可以粘贴网址并将其替换为“cgi.soic.indiana.edu/~team19/home_page_no_mood.php”
  • demo0785838.mockable.io/cgi.soic.indiana.edu/~team19/… 我们尝试用这个可模拟的链接替换 ​​php 链接,但没有显示错误。在上面添加 logcat。

标签: android listview arraylist adapter


【解决方案1】:

您加载数据的异步任务已被注释掉,因此未执行。

     //new HomePageActivity(this).execute();

注意:您应该将 HomePageActivity 重命名为 LoadDataTask

【讨论】:

  • 谢谢!我添加了一个变体,并将其移动到正确的位置。新的 HomePageActivity().execute();现在我的代码运行通过,显示一个空白列表视图,但在屏幕上显示 else 错误:“无法从服务器获取 json。检查 LogCat 是否有可能的错误!”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
相关资源
最近更新 更多