android:ArrayAdapter在AsyncTask

时间:2016-10-23 18:00:28

标签: java android android-asynctask android-arrayadapter

我正在解析一个有5个足球队的JSon文件,每个队都打了4场比赛。
我创建了一个Wrapper类OutputClass来存储每个团队的所有细节,即玩过,赢过,抽出和丢失的游戏数量。
由于有5个团队,我创建了一个OutputClass列表。 因此,在将值传递给onPostExecute之后,我调用了一个名为FootballAdapter的适配器。 该适配器只执行一次 即使我在outputClassList.get(int position)中将我的位置值更改为2或3,我也会在Toast中得到相同的结果,如下图所示。
我检查了outputClassList是否为空但不是。 对象是一个列表,从:

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

上述代码采用onPostExecute 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;
    }
}

这是我创建的日志文件,检查outputClassList是否为空:

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

在下图中可以看到ListView的剪辑:

enter image description here

2 个答案:

答案 0 :(得分:1)

问题可能出在

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

ArrayAdapter没有findViewById()(参见ArrayAdapter Reference

由于上面的代码行正在运行,您可能已将FootballAdapter类定义为上下文(例如Activity或Fragment)中的嵌套类,它使用findViewById()方法。在这种情况下,您将搜索&#34;第一个&#34;整个上下文中具有指定标识的窗口小部件。因此,您的适配器实际上是针对列表中的所有项执行的,但每次调用它时,它都会覆盖第一个小部件(例如第一个小部件.R.id.rank和第一个R.id.played等)

试试这个

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

这样,您指的是适配器应该填充的List Item内的TextView,而不是整个上下文中的第一个项。 (见View Reference

答案 1 :(得分:0)

尝试打印你的posttexecute()的结果,看看你在postupdate中得到了什么,之后你会知道究竟是什么问题,如果你无法理解那么再发布一些关于你的更多信息响应和适配器类