Android - setAdapter函数的空指针

时间:2015-10-15 01:50:25

标签: android json http

我正在开发一款应用,我试图展示一个充满MySQL数据库信息的列表视图。我已经有一个不同的活动,我使用PHP从数据库发送和接收,我做了类似的事情。我不确定我遇到的错误是适配器类还是AsyncTask中的Json Parsing部分。这些是文件:

package com.example.xxx.xxx;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
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;


public class ListActivity extends ActionBarActivity {



    ListView list;
    ArrayList<Places> placeslist;
    PlacesAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.single_row);
        placeslist = new ArrayList<Places>();
        new JASONTask().execute("http://xxx.xxx.com/getlist.php");

        adapter = new PlacesAdapter(getApplicationContext(), R.layout.single_row, placeslist);

        list = (ListView)findViewById(R.id.listView);
        list.setAdapter(adapter);

    }

    public class JASONTask extends AsyncTask<String,Void,Boolean>{

        ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = new ProgressDialog(ListActivity.this);
            dialog.setMessage("Loading, please wait");
            dialog.setTitle("Connecting server");
            dialog.show();
            dialog.setCancelable(false);
        }

        @Override
        protected Boolean doInBackground(String... params) {

            HttpURLConnection connection = null;
            BufferedReader reader = null;

            try {
                URL url = new URL(params[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();

                InputStream stream = connection.getInputStream();

                reader = new BufferedReader(new InputStreamReader(stream));

                StringBuffer buffer = new StringBuffer();
                String line ="";
                while ((line = reader.readLine()) != null){
                    buffer.append(line);
                }

                String finalJson = buffer.toString();

                JSONArray theJson = new JSONArray(finalJson);


                for (int i=0; i<theJson.length(); i++){
                    Places place = new Places();

                    JSONObject jRealObject = theJson.getJSONObject(i);

                    place.setPlaces_id(jRealObject.getString("places_id"));
                    place.setName(jRealObject.getString("name"));
                    place.setLocation_address(jRealObject.getString("location_address"));

                    placeslist.add(place);
                }


            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            } finally {
                if(connection != null) {
                    connection.disconnect();
                }
                try {
                    if (reader != null){
                        reader.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            return true;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            if (result == false){
                //message not parsed
            }

        }
    }

}

Places类是:

package com.example.xxx.xxx;

/**
 * Created by manhols on 10/12/2015.
 */
public class Places {

    private String places_id;
    private String name;
    private String location_address;

    public Places(){

    }

    public String getPlaces_id() {
        return places_id;
    }

    public void setPlaces_id(String places_id) {
        this.places_id = places_id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLocation_address() {
        return location_address;
    }

    public void setLocation_address(String location_address) {
        this.location_address = location_address;
    }
}

PlacesAdapter类是:

package com.example.xxx.xxx;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by manhols on 10/12/2015.
 */
public class PlacesAdapter extends ArrayAdapter<Places>{

    ArrayList<Places> placeslist;
    int Resource;
    Context context;
    LayoutInflater vi;

    public PlacesAdapter(Context context, int resource, ArrayList<Places> objects) {
        super(context, resource, objects);

        Resource = resource;
        placeslist = objects;

        vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

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

        ViewHolder holder;
        if(convertView == null){
            vi.inflate(Resource, null);
            convertView = vi.inflate(Resource,null);
            holder = new ViewHolder();

            holder.textView = (TextView)convertView.findViewById(R.id.textView);
            holder.textView2 = (TextView)convertView.findViewById(R.id.textView2);
            holder.textView5 = (TextView)convertView.findViewById(R.id.textView5);

            convertView.setTag(holder);

        } else {
            holder = (ViewHolder)convertView.getTag();

        }

        holder.textView.setText(placeslist.get(position).getName());
        holder.textView2.setText(placeslist.get(position).getPlaces_id());
        holder.textView5.setText(placeslist.get(position).getLocation_address());
        return convertView;
    }

    static class ViewHolder {
        public TextView textView;
        public TextView textView2;
        public TextView textView5;
    }
}

我将非常感谢任何帮助解决这个问题。

2 个答案:

答案 0 :(得分:0)

我发现适配器中存在一些错误。请将行膨胀为convertView = vi.inflate(Resource,parent,false);,并在解析数据时,仅在try块中返回true。从你的代码我可以看到,即使你有一个例外,你将返回true,这是错误的。

答案 1 :(得分:0)

我的问题出在setContentView中,就像之前提到的@codeMagic一样。我已经解决了这个问题,感谢他