gpt4 book ai didi

java - android: ArrayAdapter 在 AsyncTask 中只执行一次

转载 作者:行者123 更新时间:2023-11-30 10:37:11 24 4
gpt4 key购买 nike

我正在解析一个 JSon 文件,其中有 5 个足球队,每个球队都打了 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);

以上代码在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 的 fragment :

enter image description here

最佳答案

问题可能出在线路上

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)

关于java - android: ArrayAdapter 在 AsyncTask 中只执行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40206133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com