【问题标题】:android: ArrayAdapter executing only one time in AsyncTaskandroid:ArrayAdapter 在 AsyncTask 中只执行一次
【发布时间】:2016-10-23 18:00:28
【问题描述】:

我正在解析一个 JSon 文件,其中包含 5 支足球队,每支球队都打了 4 场比赛。
我创建了一个 Wrapper 类 OutputClass 来存储每支球队的所有详细信息,即比赛、获胜、平局和失败的数量。
由于有 5 个团队,我创建了一个 OutputClass 列表。 所以在将值传递给onPostExecute 之后,我调用了一个名为FootballAdapter 的适配器。 此适配器仅执行一次。
即使我将 outputClassList.get(int position) 中的位置值更改为 2 或 3,我在 Toast 中也会得到相同的结果,如下图所示。
我检查了outputClassList 是否为空,但不是。 Objects 是一个列表,传递自:

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

以上代码在AsyncTaskonPostExecute方法中。

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 的片段如下图所示:

【问题讨论】:

    标签: java android android-asynctask android-arrayadapter


    【解决方案1】:

    问题大概出在这条线上

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

    ArrayAdapter 没有 findViewById()(参见ArrayAdapter Reference

    由于上述行有效,您可能已将 FootballAdapter 类定义为上下文(例如 Activity 或 Fragment)内的嵌套类,从中使用 findViewById() 方法。在这种情况下,您将在整个上下文中搜索具有指定 id 的“第一个”小部件。因此,您的适配器实际上正在执行列表中的所有项目,但是每次调用它时,它都会覆盖第一个小部件(例如第一个 R.id.rank 和第一个 R.id.played 等)

    试试这个

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

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

    【讨论】:

    • 非常感谢@Ahmed,我通过反复试验找到了完全相同的答案,但不知道为什么。现在我知道了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多