2016-12-05 5 views
-3
public class MainActivity extends AppCompatActivity { 

ListView lv; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     lv=(ListView)findViewById(R.id.list_id); 
     new JsonTask().execute("https://www.dropbox.com/s/o8yqrfm08wfdh48/Hotels.txt?dl=0"); 
    } 

class JsonTask extends AsyncTask<String,String ,List<MovieModels>>{ 
    @Override 
    protected List<MovieModels> 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(); 

      JSONObject parentObject = new JSONObject(finaljson); 
      JSONArray parentArray =parentObject.getJSONArray("Hotels"); 
      List<MovieModels> modelsList=new ArrayList<>(); 

      for (int i=0; i<parentArray.length();i++) { 
       JSONObject finalobject = parentArray.getJSONObject(i); 

       MovieModels models= new MovieModels(); 
       models.setImage(finalobject.getString("Image")); 
       models.setHotel_Name(finalobject.getString("Hotel_Name")); 

       modelsList.add(models); 

      } 

       return modelsList; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


     return null; 
    } 

    @Override 
    protected void onPostExecute(List<MovieModels> result) { 
     super.onPostExecute(result); 

     Adapter adapter=new Adapter(getApplicationContext(),R.layout.row,result); 
     lv.setAdapter(adapter); 

     //to do set the data into list 


    } 
} 

public class Adapter extends ArrayAdapter{ 

private List<MovieModels> modelsList; 
    private int resource; 
    private LayoutInflater inflater; 
    public Adapter(Context context, int resource, List<MovieModels> objects) { 
     super(context, resource, objects); 
     modelsList= objects; 
     this.resource=resource; 
     inflater=(LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    } 

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

     if (convertView==null){ 
      convertView=inflater.inflate(R.layout.row,null); 

     } 
     ImageView imageView; 
     TextView textView; 
     imageView=(ImageView)convertView.findViewById(R.id.image_id); 
     textView=(TextView)convertView.findViewById(R.id.text_id); 

     ImageLoader.getInstance().displayImage(modelsList.get(position).getImage(),imageView); 


     textView.setText("Hotel_Name-"+modelsList.get(position).getHotel_Name()); 

     return convertView; 
    } 
}} 

Ich habe einen Fehler in der Menge Adapterklasse, könnte jemand raten?java.lang.NullPointerException: Versuch Schnittstelle Methode aufzurufen ‚int java.util.List.size()

+0

Was ist Ihre Frage? – Carcigenicate

+0

poste bitte deinen MovieModels.java code bitte –

+1

übrigens die ersten 3 artikel im json array sind Hotelname und nicht Hotel_Name fehlt das _ also repariere es wenn du alle ergebnisse bekommen willst –

Antwort

0

Erstellen Sie eine Klasse für Ihre MovieModels wie folgt aus:

public class MovieModels(){ 
    private String imagePath, hotelName; 

    public MovieModels(String imagePath, String hotelName){ 
     this.imagePath = imagePath; 
     this.hotelName = hotelName; 
    } 

    public String getImagePath(){ 
     return imagePath; 
    } 

    public String getHotelName(){ 
     return hotelName; 
    } 

    public void setImagePath(String imagePath){ 
     this.imagePath = imagePath; 
    } 

    public void setHotelName(String hotelName){ 
     this.hotelName = hotelName; 
    } 


} 

und dann doInBackground() Methode wie folgt ändern:

@Override 
    protected List<MovieModels> doInBackground(String...Params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 
     List<MovieModels> modelsList=new ArrayList<>(); 
     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(); 

      JSONObject parentObject = new JSONObject(finaljson); 
      JSONArray parentArray =parentObject.getJSONArray("Hotels"); 
      for (int i=0; i<parentArray.length();i++) { 
       JSONObject finalobject = parentArray.getJSONObject(i); 
       String image = finalobject.getString("Image"); 
       String hotelName = finalobject.getString("Hotel_Name"); 
       modelsList.add(new MovieModels(image, hotelName)); 
      } 

      return modelsList; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


     return null; 
    } 

und Ihre postExecute() wie folgt aus:

@Override 
protected void onPostExecute(List<MovieModels> result) { 
    super.onPostExecute(result); 
    if (result == null) { 
     Log.e("MY APPLICATION", "No result to display"); 
    } 
    Adapter adapter=new Adapter(getApplicationContext(),R.layout.row,result); 
    lv.setAdapter(adapter); 

    //to do set the data into list 
} 

Hoffnung es hilft!!!

+0

Es kann immer noch die NullPointerException wie in meiner Antwort erwähnt – fbwnd

+0

vergaß die onPost –

+0

Ich habe eine MovieModels Klasse ..Was immer Sie mich vorschlagen, habe ich das getan Der Code wird ausgeführt, zeigt aber nichts an. nur leerer Bildschirm. und ich korrigiere auch die JSON-Datei, die Fehler vorgeschlagen wurde. PLZ ..help – Amol

0

Sie geben null in Ihrem doInBackground zurück und stellen es dann auf den Adapter ein.

Sie haben 2 Möglichkeiten, es zu lösen:

  1. Return ein leeres Array beispiels return new ArrayList<>(); statt return null oder Überprüfen Sie den Adapter nicht im Falle seiner Null gesetzt. zB:

    @Override 
    protected void onPostExecute(List<MovieModels> result) { 
        super.onPostExecute(result); 
        if (result == null) { 
         //todo handle no result 
         return; 
        } 
        Adapter adapter=new Adapter(getApplicationContext(),R.layout.row,result); 
        lv.setAdapter(adapter); 
    
        //to do set the data into list 
    } 
    

    }

Edit:

Außerdem, wie gesagt in den Kommentaren, Ihre JSON Key Sie versuchen ("HOTEL_NAME") zu bekommen ist nicht wie die einer der JSON selbst (sein "Hotelname" in der JSON). Nachdem Sie das behoben haben, sehen Sie die Liste, obwohl es immer noch wichtig ist, die Ausnahme zuerst zu lösen.

+0

Thanxx ...... Es funktioniert, aber nicht die ListView .... – Amol

+0

Sie müssen immer noch die JSON beheben. Der Schlüssel ist falsch, so dass es nicht gut analysiert – fbwnd

+0

Ich habe richtigen Schlüssel. aber danach wird auch die ListView nicht angezeigt. – Amol

Verwandte Themen