2015-10-15 3 views
0

Я работаю над приложением, и я пытаюсь показать список, заполненный информацией из базы данных MySQL. У меня уже есть другая деятельность, когда я отправляю и получаю из базы данных с помощью php, я делаю что-то подобное. Я не уверен, что у меня есть ошибка с классом адаптера или с частью Json Parsing в AsyncTask. Это файлы:Android - Нулевой указатель на функцию setAdapter

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 
      } 

     } 
    } 

} 

Места класс:

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; 
    } 
} 

Я высоко ценю решение какой-либо помощи этой проблемы.

+0

Просьба предоставить трассировку стека, сгенерированную при возникновении исключения. – alkber

+0

'AsyncTask' является асинхронным, как предполагает название. Это означает, что он скорее всего не будет завершен до того, как остальная часть кода будет выполнена. Вам нужно вызвать функцию в 'onPostExecute()' для обработки адаптера или поместить его непосредственно в этот метод. – codeMagic

+0

Но да, разместите свой стек. У меня такое чувство, что 'setContentView (R.layout.single_row);' раздувает макет для ваших строк в 'ListView'. Это должно быть раздувание макета, который фактически содержит ваш 'ListView', поэтому он' null', когда вы пытаетесь инициализировать его 'list = (ListView) findViewById (R.id.listView);' – codeMagic

ответ

0

Я заметил некоторые ошибки в вашем адаптере. Пожалуйста, раздуйте строку как convertView = vi.inflate(Resource,parent,false);, а также при анализе данных верните true только в блок try. Из вашего кода я вижу, что даже если у вас есть исключение, вы будете возвращать true, что неправильно.

+0

Привет, Шри, спасибо за вашу помощь. Моя проблема была в setContentView как @codeMagic, упомянутом ранее. Я уже решил это благодаря ему. Еще раз спасибо! – manhols

+0

Отлично, я не видел эту линию. Благодарим вас за упоминание. Но используйте оператор возврата, как я сказал, это будет полезно –

0

Моя проблема была в setContentView как @codeMagic, упомянутом ранее. Я уже решил это благодаря ему

Смежные вопросы