2016-10-23 3 views
2

Ich Parsing eine JSon-Datei, die 5 Fußballmannschaften hat und jeder von ihnen 4 Spiele gespielt haben.
Ich erstellte eine Wrapper-Klasse OutputClass, um alle Details jedes Teams zu speichern, d. H. Anzahl der Spiele gespielt, gewonnen, gezogen und verloren.
Da es 5 Teams gibt, habe ich eine Liste von OutputClass erstellt. Nachdem ich den Wert an onPostExecute übergeben habe, rufe ich einen Adapter namens FootballAdapter. Dieser Adapter wird nur einmal ausgeführt.
Auch wenn ich in outputClassList.get(int position) meinen Positionswert auf 2 oder 3 ändere, erhalte ich das gleiche Ergebnis in Toast, wie Sie in der folgenden Abbildung sehen können.
Ich habe überprüft, ob die outputClassList leer ist, aber es ist nicht. Objekte ist eine Liste, die aus übergeben wird:
Android: ArrayAdapter nur einmal in AsyncTask

FootballAdapter adapter= new FootballAdapter(getApplicationContext(),R.layout.row,result); 
     jsonList.setAdapter(adapter); 

Der obige Code ist in onPostExecute Methode der AsyncTask.

public class JSONTask extends AsyncTask<String,String,List<OutputClass>> { 

    @Override 
    protected List<OutputClass> doInBackground(String... params) { 
     HttpURLConnection connection=null; 
     BufferedReader r=null; 

     try { 
      URL url=new URL(params[0]); 

      connection=(HttpURLConnection)url.openConnection(); 
      connection.connect(); 
      InputStream stream= connection.getInputStream(); 
      r= new BufferedReader(new InputStreamReader((stream))); 
      StringBuffer stringBuffer=new StringBuffer(); 
      String line=""; 
      while((line=r.readLine())!=null){ 
       stringBuffer.append(line); 
      } 

      String finalJSON=stringBuffer.toString(); 


      /// read and parse JSON file for desired output..... 

      JSONObject parentObject= new JSONObject(finalJSON); 

      // gets the name of all the objects namels alpha, bravo charlie etc etc 
      JSONArray names=parentObject.names(); 

      // multiple objets for each team..... 
      List<OutputClass> outputClassList =new ArrayList<>(); 

      String games[]=new String[4]; 
      int finalScore[]=new int[names.length()]; 
      int gd[]=new int[names.length()]; 
      int won[]=new int[names.length()]; 
      int draw[]=new int[names.length()]; 
      int lost[]=new int[names.length()]; 



      JSONObject[] mainObject=new JSONObject[names.length()]; 
      for(int i=0;i<names.length();i++){ 

       String teamName=names.getString(i); 
       mainObject[i]=parentObject.getJSONObject(teamName); 

       //outputClass[i].name=teamName; 
       // Gets the game data for each game.... 

       games[0]=mainObject[i].getString("match_1"); 
       games[1]=mainObject[i].getString("match_2"); 
       games[2]=mainObject[i].getString("match_3"); 
       games[3]=mainObject[i].getString("match_4"); 

       // Calculates the final score and goal difference for each team. 

       for(int j=0;j<4;j++) { 
        String score[] = games[j].split("-"); 
        int score1 = Integer.parseInt(score[0]); 
        int score2 = Integer.parseInt(score[1]); 

        if (score1 > score2) { 
         finalScore[i] += 3; 
         won[i]++; 
        } 
        else if (score1 == score2) { 
         finalScore[i] += 1; 
         draw[i]++; 
        }else{ 
         lost[i]++; 
        } 
        gd[i]+=score1-score2; 

       } 



       // Calculating the position based on final score and Goal Difference... 

       OutputClass outputClass=new OutputClass(); 
       outputClass.goalDifference=gd[i]; 
       outputClass.draw=draw[i]; 
       outputClass.finalScore=finalScore[i]; 
       outputClass.lost=lost[i]; 
       outputClass.won=won[i]; 
       outputClass.played=4; 
       outputClass.name=teamName; 

       outputClassList.add(outputClass); 


      } 
      //Arrays.sort(outputClass,OutputClass.FinalScoreComparator); 
      //Arrays.sort(outputClass,new OutputClass().FinalScoreComparator); 
      Collections.sort(outputClassList,new OutputClass().FinalScoreComparator); 

      Log.i(TAG,"Final Scre: "+outputClassList.get(0).finalScore+" won : "+outputClassList.get(0).won); 
      Log.i(TAG,"Final Scre: "+outputClassList.get(1).finalScore+" won : "+outputClassList.get(1).won); 
      Log.i(TAG,"Final Scre: "+outputClassList.get(2).finalScore+" won : "+outputClassList.get(2).won); 
      Log.i(TAG,"Final Scre: "+outputClassList.get(3).finalScore+" won : "+outputClassList.get(3).won); 
      //return stringBuffer.toString(); 
      return outputClassList; 

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

     return null; 
    } 


    @Override 

    protected void onPostExecute(List<OutputClass> result){ 
     super.onPostExecute(result); 

     FootballAdapter adapter= new FootballAdapter(getApplicationContext(),R.layout.row,result); 
     jsonList.setAdapter(adapter); 

     //to remove the button and text view after clicking them... 
     imageButton.setVisibility(View.GONE); 
     jsonData.setVisibility(View.GONE); 
     //showing the list..... 
     setContentView(jsonList); 


    } 


} 

public class FootballAdapter extends ArrayAdapter<OutputClass>{ 

    private List<OutputClass> outputClassList; 
    private int resource; 
    private LayoutInflater inflater; 

    public FootballAdapter(Context context, int resource, List<OutputClass> objects) { 
     super(context, resource, objects); 
     outputClassList = objects; 
     this.resource=resource; 
     inflater =(LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    } 

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

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


     TextView rank; 
     TextView played; 
     TextView won; 
     TextView lost; 
     TextView draw; 
     TextView gd; 

     rank=(TextView)findViewById(R.id.rank); 
     played=(TextView)findViewById(R.id.played); 
     won=(TextView)findViewById(R.id.won); 
     lost=(TextView)findViewById(R.id.lost); 
     draw=(TextView)findViewById(R.id.draw); 
     gd=(TextView)findViewById(R.id.gd); 

     if(rank!=null) 
      played.setText("Played: " + outputClassList.get(position).played); 
     if(won!=null) 
      won.setText("Won: " + outputClassList.get(position).won); 
     if(lost!=null) 
      lost.setText("Lost: " + outputClassList.get(position).lost); 
     if(draw!=null) 
      draw.setText("Draw: " + outputClassList.get(position).draw); 
     if(gd!=null) 
      gd.setText("Goal Diff: " + outputClassList.get(position).goalDifference); 


     Toast toast=Toast.makeText(getApplicationContext(),"Played: "+outputClassList.get(4).played+"Won: "+outputClassList.get(4).won,Toast.LENGTH_LONG); 
     toast.show(); 
     return convertView; 
    } 
} 

Dies ist die Protokolldatei, die ich zu überprüfen, erstellt ot, wenn die outputClassList leer ist oder nicht:

I/enpFootball: Final Scre: 8 won : 2 
I/enpFootball: Final Scre: 7 won : 2 
I/enpFootball: Final Scre: 7 won : 2 
I/enpFootball: Final Scre: 5 won : 1 

A von ListView snipped können unten auf dem Bild zu sehen:

enter image description here

Antwort

1

Das Problem ist wahrscheinlich in der Linie

rank=(TextView)findViewById(R.id.rank); 

ArrayAdapter nicht über findViewById() (Siehe ArrayAdapter Reference)

Da die obige Zeile funktioniert, haben Sie wahrscheinlich Ihre FootballAdapter-Klasse als eine geschachtelte Klasse in einem Kontext definiert (z. B. Aktivität oder Fragment), von dem aus die findViewById() -Methode verwendet wird. In diesem Fall suchen Sie im gesamten Kontext nach dem "ersten" Widget mit der angegebenen ID. Also, Ihr Adapter wird eigentlich für alle Elemente in der Liste ausgeführt, aber jedes Mal, wenn er aufgerufen wird, überschreibt er das erste Widget (zB das erste. R.id.rank, und das erste R.id.played, etc.)

Versuchen Sie stattdessen

rank= (TextView) convertView.findViewById(R.id.rank); 

diese Weise können Sie auf die Textview in der Liste Artikel verweisen, dass der Adapter das erste Element füllen und nicht im gesamten Kontext soll. (Siehe View Reference)

+0

Vielen Dank Mann @Ahmed, ich fand die gleiche Antwort durch Versuch und Irrtum, aber wusste nicht, warum. Jetzt weiß ich. – Subhash

0

versuchen Sie, Ihr Ergebnis von postexecute() zu drucken und sehen Sie, was Sie in Ihrem Postupdate bekommen, danach würden Sie wissen, was exa ctly das Problem ist, wenn Sie nicht in der Lage sind dann wieder zu verstehen, schreiben einige weitere Informationen über Ihre Antwort und Adapterklasse

Verwandte Themen