ListActivity上的空白屏幕从mySQL填充

时间:2012-01-07 00:55:12

标签: android mysql arrays listview listactivity

这是我第一次尝试创建从远程mySQL数据库填充的ListActivity。我从本地SQLite数据库获取数据时工作正常。我需要修改我的类以从远程数据库获取数据,所以我尝试通过遵循教程和文档来调整我的类。由于我的观点和使用'getExtras'的复杂性,我无法弄清楚这一点。

我的问题是:现在有了修订版,我得到一个空白列表,在LogCat中没有错误;所以你能看到我班上的错吗?建议?

public class QueryDisplayList extends ListActivity {

    private static final String PHP_KEY = "PHP_KEY";
    private static final String QUERY_ORDER = "QUERY_ORDER";

    JSONArray jArray;
    String result = null;
    InputStream is = null;
    StringBuilder sb = null;

    // private Object tvLabel = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle extras = getIntent().getExtras();
        setContentView(R.layout.list_view2);

        /**
         * Get the query string from last activity and pass it to this
         * activity-----------------------------------------------------
         */
        // String p = null;
        // if (extras != null) {
        // p = extras.getString(PHP_KEY);
        // }
        loadQuery();
    }

    void loadQuery() {

        new Thread(new Runnable() {

            public void run() {

                String qO = getIntent().getStringExtra("QUERY_ORDER");
                String php = getIntent().getStringExtra("PHP_KEY");

                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                // http post
                try {
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost(
                            "http://10.0.2.2/App/php/" + php + qO + ".php");

                    Log.e("log_tag", "Fetched " + php + qO + ".php");

                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();
                    is = entity.getContent();

                } catch (Exception e) {

                    Log.e("log_tag", "Error in http connection " + e.toString());
                }

                // convert response to string
                try {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(is, "iso-8859-1"), 8);
                    sb = new StringBuilder();
                    sb.append(reader.readLine() + "\n");

                    String line = "0";
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }

                    is.close();
                    result = sb.toString();

                } catch (Exception e) {
                    Log.e("log_tag", "Error converting result " + e.toString());
                }

            }
        }).start();

        setListAdapter(new QueryAdapter(this, result));
    }

    /**
     * The Query Adaptor --------------------------------------------
     */

    private class QueryAdapter extends ArrayAdapter<String> {

        private Activity context;

        public QueryAdapter(Activity context, String result) {
            super(context, R.layout.list_view2);
            this.context = context;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = context.getLayoutInflater();
            View rowView = inflater.inflate(R.layout.list_item, null, true);

            try {
                jArray = new JSONArray(result);
                JSONObject json_data = null;

                for (int i = 0; i < jArray.length(); i++) {

                    json_data = jArray.getJSONObject(i);

                    final String tvLabel = json_data.getString("label");
                    TextView labelTxt = (TextView) convertView
                            .findViewById(R.id.label);
                    if (labelTxt != null) {
                        labelTxt.setText("(" + tvLabel + ")");
                    }

                    final String tvTitle = json_data.getString("title");
                    TextView titleTxt = (TextView) convertView
                            .findViewById(R.id.listTitle);
                    if (titleTxt != null) {
                        titleTxt.setText(tvTitle);
                    }

                    String tvDescription = json_data.getString("description");
                    TextView descriptionTxt = (TextView) convertView
                            .findViewById(R.id.caption);
                    if (descriptionTxt != null) {
                        descriptionTxt.setText(tvDescription);
                    }

                    String tvDate = json_data.getString("date");
                    TextView dateTxt = (TextView) convertView
                            .findViewById(R.id.dateAdded);
                    if (dateTxt != null) {
                        dateTxt.setText(tvDate);
                    }

                    String tvGoto = json_data.getString("gotoURL");
                    TextView gotoTxt = (TextView) convertView
                            .findViewById(R.id.dummy);
                    if (gotoTxt != null) {
                        gotoTxt.setText(tvGoto);
                    }

                    gotoTxt.setVisibility(View.GONE);
                    convertView.setTag(gotoTxt);

                    final String ni = json_data.getString("intent");

                    final ListView lv = getListView();
                    lv.setEnabled(true);
                    lv.setClickable(true);

                    /**
                     * Click Listeners --------------------------------
                     */
                    lv.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> arg0, View v,
                                int arg2, long arg3) {

                            // -- Set the domain name in the strings.xml file
                            // once
                            // the
                            // DNS is established for the website.
                            String mDomain = getResources().getString(
                                    R.string.domain);

                            String url = "";
                            url = mDomain + (String) v.getTag();

                            String intent = ni;
                            Class<?> nIntent = null;
                            try {
                                nIntent = Class
                                        .forName("com.andaerosystems.andaero.utili."
                                                + intent);
                            } catch (ClassNotFoundException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                            Intent i = new Intent(QueryDisplayList.this,
                                    nIntent);
                            i.putExtra("PHP_KEY", tvLabel);
                            i.putExtra("KEY_URL", url);
                            i.putExtra("KEY_SUBTITLE", tvTitle);
                            i.putExtra("KEY_LABEL", tvLabel);
                            i.putExtra("KEY_INTENT", intent);
                            i.putExtra("QUERY_ORDER", "ASC");
                            i.putExtra("KEY_YPOS", "0.0");
                            QueryDisplayList.this.startActivity(i);

                            Log.e("tag", url);
                        }
                    });
                }
            } catch (JSONException e1) {
                Toast.makeText(getBaseContext(), "No label Found",
                        Toast.LENGTH_LONG).show();
            } catch (ParseException e1) {
                e1.printStackTrace();
            }
            return rowView;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

我快速查看了你的代码。试试这个。

void loadQuery() {

        new Thread(new Runnable() {

            public void run() {

                String qO = getIntent().getStringExtra("QUERY_ORDER");
                String php = getIntent().getStringExtra("PHP_KEY");

                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                // http post
                try {
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost(
                            "http://10.0.2.2/App/php/" + php + qO + ".php");

                    Log.e("log_tag", "Fetched " + php + qO + ".php");

                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();
                    is = entity.getContent();

                } catch (Exception e) {

                    Log.e("log_tag", "Error in http connection " + e.toString());
                }

                // convert response to string
                try {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(is, "iso-8859-1"), 8);
                    sb = new StringBuilder();
                    sb.append(reader.readLine() + "\n");

                    String line = "0";
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }

                    is.close();
                    result = sb.toString();
                   YourActivity.this.runOnUiThread(new Runnable(){

            @Override
            public void run() {
                YourActivity.this.setListAdapter(new QueryAdapter(this, result));
            }});

                } catch (Exception e) {
                    Log.e("log_tag", "Error converting result " + e.toString());
                }


            }
        }).start();


    }

答案 1 :(得分:0)

您是否逐步调试并检出了变量的结果值?

示例:解析json文件时输入错误或getString()中的错误会停止进程。

答案 2 :(得分:0)

首先,您不会将从HttpPost收到的新结果传递给适配器(因为在获得响应之前已创建适配器)。

此外,getView并不意味着像这样使用。它的作用是在列表中创建一个项目。你正在做的是创建所有项目。您应该做的是解析数据并将包含已解析数据的列表添加到适配器。

看一下这个例子:http://sudarmuthu.com/blog/using-arrayadapter-and-listview-in-android-applications

相关问题