Android 每次我试图显示Json响应时,都会在我的卡片视图中重复相同的元素(改装)

Android 每次我试图显示Json响应时,都会在我的卡片视图中重复相同的元素(改装),android,retrofit2,android-recyclerview,android-cardview,Android,Retrofit2,Android Recyclerview,Android Cardview,我的JSON响应以一个JSON数组开始,其中进一步包含三个数组。我想在我的卡片视图中显示这些数组的内容。似乎在每个循环中,我总是更改相同的ViewHolder,因此结果总是最后一个循环的最后一项。onBindViewHolder中的int i指示将显示的项目的位置 [ { "firstTeam_VS_secondTeam": [{ "match_id": "248036", "country_id": "169", "country_name": "England"

我的JSON响应以一个JSON数组开始,其中进一步包含三个数组。我想在我的卡片视图中显示这些数组的内容。似乎在每个循环中,我总是更改相同的ViewHolder,因此结果总是最后一个循环的最后一项。
onBindViewHolder
中的
int i
指示将显示的项目的位置

[
   {
"firstTeam_VS_secondTeam": [{
    "match_id": "248036",
    "country_id": "169",
    "country_name": "England",
    "league_id": "70",
    "league_name": "Capital One Cup",
    "match_date": "2018-01-24",
    "match_status": "FT",
    "match_time": "21:00",
    "match_hometeam_name": "Arsenal",
    "match_hometeam_score": "2",
    "match_awayteam_name": "Chelsea",
    "match_awayteam_score": "1",
    "match_hometeam_halftime_score": "1",
    "match_awayteam_halftime_score": "1",
    "match_live": "1"
},
.....
],"firstTeam_lastResults": [{
    "match_id": "248036",
    "country_id": "169",
    "country_name": "England",
    "league_id": "70",
    "league_name": "Capital One Cup",
    "match_date": "2018-01-24",
    "match_status": "FT",
    "match_time": "21:00",
    "match_hometeam_name": "Arsenal",
    "match_hometeam_score": "2",
    "match_awayteam_name": "Chelsea",
    "match_awayteam_score": "1",
    "match_hometeam_halftime_score": "1",
    "match_awayteam_halftime_score": "1",
    "match_live": "1"
},
.....
],  "secondTeam_lastResults": [{
    "match_id": "248036",
    "country_id": "169",
    "country_name": "England",
    "league_id": "70",
    "league_name": "Capital One Cup",
    "match_date": "2018-01-24",
    "match_status": "FT",
    "match_time": "21:00",
    "match_hometeam_name": "Arsenal",
    "match_hometeam_score": "2",
    "match_awayteam_name": "Chelsea",
    "match_awayteam_score": "1",
    "match_hometeam_halftime_score": "1",
    "match_awayteam_halftime_score": "1",
    "match_live": "1"
},
.....
]
我的
Onbindviewholder
类,我尝试了此代码,但它在我的所有卡片视图中显示了相同的详细信息集

@Override
public void onBindViewHolder(@NonNull footballmatchadapter.ViewHolder viewHolder, int i) {
    List<FirstTeamVSSecondTeam> firstTeamVSSecondTeams;
    List<FirstTeamLastResult> firstTeamLastResults;
    List<SecondTeamLastResult> secondTeamLastResults;
    firstTeamVSSecondTeams=post.getFirstTeamVSSecondTeam();
    firstTeamLastResults=post.getFirstTeamLastResults();
    secondTeamLastResults=post.getSecondTeamLastResults();
    viewHolder.tvleague.setText(firstTeamVSSecondTeams.size());
    viewHolder.tvhometeamscore.setText(firstTeamLastResults.size());
    viewHolder.tvdate.setText(secondTeamLastResults.size());
    if(post.getFirstTeamVSSecondTeam()!=null) {
        firstTeamVSSecondTeams = post.getFirstTeamVSSecondTeam();
    }
    if(post.getFirstTeamLastResults()!=null) {
        firstTeamLastResults = post.getFirstTeamLastResults();

    }
    if(post.getSecondTeamLastResults()!=null) {
        secondTeamLastResults = post.getSecondTeamLastResults();
    }
    String leauge="",date="",team1="",team2="",team1score="",team2score="";
    if(firstTeamVSSecondTeams!=null)
    {
        for(FirstTeamVSSecondTeam 
       firstTeamVSSecondTeam:firstTeamVSSecondTeams)
        {
            leauge=firstTeamVSSecondTeam.getLeagueName();
            date="Match Date "+firstTeamVSSecondTeam.getMatchDate();
            team1="Home Team "+firstTeamVSSecondTeam.getMatchHometeamName();
            team2="Second Team 
      "+firstTeamVSSecondTeam.getMatchAwayteamName();
            team1score=firstTeamVSSecondTeam.getMatchHometeamName()+" : 
      "+firstTeamVSSecondTeam.getMatchHometeamScore();
            team2score=firstTeamVSSecondTeam.getMatchAwayteamName()+" : 
       "+firstTeamVSSecondTeam.getMatchAwayteamScore();
            viewHolder.tvleague.setText(leauge);
            viewHolder.tvdate.setText(date);
            viewHolder.tvhometownteam.setText(team1);
            viewHolder.tvawayteam.setText(team2);
            viewHolder.tvhometeamscore.setText(team1score);
            viewHolder.tvawayteamscore.setText(team2score);

        }
    }
    if(firstTeamLastResults!=null)
    {
        for(FirstTeamLastResult firstTeamLastResult:firstTeamLastResults)
        {
            leauge=firstTeamLastResult.getLeagueName();
            date="Match Date "+firstTeamLastResult.getMatchDate();
            team1="Home Team "+firstTeamLastResult.getMatchHometeamName();
            team2="Second Team "+firstTeamLastResult.getMatchAwayteamName();
            team1score=firstTeamLastResult.getMatchHometeamName()+" : 
           "+firstTeamLastResult.getMatchHometeamScore();
            team2score=firstTeamLastResult.getMatchAwayteamName()+" : 
             "+firstTeamLastResult.getMatchAwayteamScore();
            viewHolder.tvleague.setText(leauge);
            viewHolder.tvdate.setText(date);
            viewHolder.tvhometownteam.setText(team1);
            viewHolder.tvawayteam.setText(team2);
            viewHolder.tvhometeamscore.setText(team1score);
            viewHolder.tvawayteamscore.setText(team2score);

        }
    }
    if(secondTeamLastResults!=null)
    {
        for(SecondTeamLastResult SecondTeamLastResult:secondTeamLastResults)
        {
            leauge=SecondTeamLastResult.getLeagueName();
            date="Match Date "+SecondTeamLastResult.getMatchDate();
            team1="Home Team "+SecondTeamLastResult.getMatchHometeamName();
            team2="Second Team 
     "+SecondTeamLastResult.getMatchAwayteamName();
            team1score=SecondTeamLastResult.getMatchHometeamName()+" : 
     "+SecondTeamLastResult.getMatchHometeamScore();
            team2score=SecondTeamLastResult.getMatchAwayteamName()+" : 
      "+SecondTeamLastResult.getMatchAwayteamScore();
            viewHolder.tvleague.setText(leauge);
            viewHolder.tvdate.setText(date);
            viewHolder.tvhometownteam.setText(team1);
            viewHolder.tvawayteam.setText(team2);
            viewHolder.tvhometeamscore.setText(team1score);
            viewHolder.tvawayteamscore.setText(team2score);

        }
    }
}

首先,似乎每个结果列表都不需要不同的类。您应该创建一个类,如:

public class MatchResults {
    @SerializedName("match_id")
    private long matchId;

    @SerializedName("country_id")
    private long countryId;

    @SerializedName("country_name")
    private String countryName;
    ...
}
您的适配器应该如下所示:

public class FootballMatchAdapter extends RecyclerView.Adapter<FootballMatchAdapter.ViewHolder> {

    private List<MatchResults> firstTeamVSSecondTeams;
        private List<MatchResults> firstTeamLastResults;
        private List<MatchResults> secondTeamLastResults;

    public FootbalMatchAdapter() {
        loadData();
    }

    private void loadData() {
        firstTeamVSSecondTeams = post.getFirstTeamVSSecondTeam();
        firstTeamLastResults = post.getFirstTeamLastResults();
        secondTeamLastResults = post.getSecondTeamLastResults();
    }

    private int getFirstTeamVSSecondTeamsSize() {
        return (firstTeamVSSecondTeams != null ? 
                firstTeamVSSecondTeams.size() : 0); 
    }

    private int getFirstTeamLastResultsSize() {
        return (firstTeamLastResults != null ? 
                firstTeamLastResults.size() : 0); 
    }

    private int getSecondTeamLastResultsSize() {
        return (secondTeamLastResults != null ? 
                secondTeamLastResults.size() : 0); 
    }

    @Override
    public int getItemCount() {
        return getFirstTeamVSSecondTeamsSize() 
        + getFirstTeamLastResultsSize()
        + getSecondTeamLastResultsSize();
    }

    private MatchResults getItem(int i) {
        if (i < 0 || i > getItemCount())
            return null;
        if (i >= (getFirstTeamVSSecondTeamsSize() + getFirstTeamLastResultsSize())) {
            int pos = i - (getFirstTeamVSSecondTeamsSize() + getFirstTeamLastResultsSize());
            return secondTeamLastResults.get(pos);
        }
        else if (i >= getFirstTeamVSSecondTeamsSize()) {
            int pos = i - getFirstTeamVSSecondTeamsSize();
            return firstTeamLastResults.get(pos);
        }
        else {
            return firstTeamVSSecondTeams.get(i);
        }
    }

    @Override
    public FootballMatchAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ... 
    }

    @Override
    public void onBindViewHolder(@NonNull footballmatchadapter.ViewHolder 
        viewHolder, int i) {

        String leauge = "", date = "", team1 = "", team2 = "", team1score = "", team2score = "";
        MatchResult result = getItem(i);

        leauge = firstTeamVSSecondTeam.getLeagueName();
        date = "Match Date " + firstTeamVSSecondTeam.getMatchDate();
        team1 = "Home Team " + firstTeamVSSecondTeam.getMatchHometeamName();
        team2 = "Second Team " + firstTeamVSSecondTeam.getMatchAwayteamName();
        team1score = firstTeamVSSecondTeam.getMatchHometeamName() + " : "+firstTeamVSSecondTeam.getMatchHometeamScore();
        team2score = firstTeamVSSecondTeam.getMatchAwayteamName() + " : "+firstTeamVSSecondTeam.getMatchAwayteamScore();

        viewHolder.tvleague.setText(leauge);
        viewHolder.tvdate.setText(date);
        viewHolder.tvhometownteam.setText(team1);
        viewHolder.tvawayteam.setText(team2);
        viewHolder.tvhometeamscore.setText(team1score);
        viewHolder.tvawayteamscore.setText(team2score);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        ...
    }
}
public类FootballMatchAdapter扩展了RecyclerView.Adapter{
私人名单第一队VS第二队;
私有列表firstTeamLastResults;
私有列表结果;
公共足球俱乐部{
loadData();
}
私有void loadData(){
firstTeamVSSecondTeams=post.getFirstTeamVSSecondTeam();
firstTeamLastResults=post.getFirstTeamLastResults();
secondTeamLastResults=post.getSecondTeamLastResults();
}
private int getFirstTeamVSSecondTeamsSize()函数{
return(firstTeamVSSecondTeams!=null?
firstTeamVSSecondTeams.size():0);
}
private int getFirstTeamLastResultsSize(){
返回(firstTeamLastResults!=null?
firstTeamLastResults.size():0);
}
private int getSecondTeamLastResultsSize(){
返回(secondTeamLastResults!=空?
secondTeamLastResults.size():0);
}
@凌驾
public int getItemCount(){
返回getFirstTeamVSSecondTeamsSize()
+getFirstTeamLastResultsSize()
+getSecondTeamLastResultsSize();
}
私有匹配结果getItem(int i){
if(i<0 | | i>getItemCount())
返回null;
如果(i>=(getFirstTeamVSSecondTeamsSize()+getFirstTeamLastResultsSize()){
int pos=i-(getFirstTeamVSSecondTeamsSize()+getFirstTeamLastResultsSize());
返回secondTeamLastResults.get(pos);
}
如果(i>=getFirstTeamVSSecondTeamsSize()),则为else{
int pos=i-getFirstTeamVSSecondTeamsSize();
返回firstTeamLastResults.get(pos);
}
否则{
返回firstTeamVSSecondTeams.get(i);
}
}
@凌驾
public Football MatchAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
... 
}
@凌驾
BindViewHolder(@NonNull footballmatchadapter.ViewHolder)上的公共无效
视窗夹,int i){
字符串leauge=“”,date=“”,team1=“”,team2=“”,team1score=“”,team2score=“”;
MatchResult结果=getItem(i);
leauge=firstTeamVSSecondTeam.getLeagueName();
date=“Match date”+firstTeamVSSecondTeam.getMatchDate();
team1=“主队”+firstTeamVSSecondTeam.getMatchHometeamName();
team2=“Second Team”+firstTeamVSSecondTeam.getMatchAwayteamName();
team1score=firstTeamVSSecondTeam.getMatchHometeamName()+“:”+firstTeamVSSecondTeam.getMatchHometeamScore();
team2score=firstTeamVSSecondTeam.getMatchAwayteamName()+“:“+firstTeamVSSecondTeam.getMatchAwayteamScore();
viewHolder.tvleague.setText(leauge);
viewHolder.tvdate.setText(日期);
viewHolder.tvhometownsteam.setText(team1);
viewHolder.tvawaytam.setText(team2);
viewHolder.tvhometeamscore.setText(team1score);
viewHolder.tvawayteamscore.setText(team2score);
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
...
}
}
我没有运行这段代码,所以可能有一些错误

public class FootballMatchAdapter extends RecyclerView.Adapter<FootballMatchAdapter.ViewHolder> {

    private List<MatchResults> firstTeamVSSecondTeams;
        private List<MatchResults> firstTeamLastResults;
        private List<MatchResults> secondTeamLastResults;

    public FootbalMatchAdapter() {
        loadData();
    }

    private void loadData() {
        firstTeamVSSecondTeams = post.getFirstTeamVSSecondTeam();
        firstTeamLastResults = post.getFirstTeamLastResults();
        secondTeamLastResults = post.getSecondTeamLastResults();
    }

    private int getFirstTeamVSSecondTeamsSize() {
        return (firstTeamVSSecondTeams != null ? 
                firstTeamVSSecondTeams.size() : 0); 
    }

    private int getFirstTeamLastResultsSize() {
        return (firstTeamLastResults != null ? 
                firstTeamLastResults.size() : 0); 
    }

    private int getSecondTeamLastResultsSize() {
        return (secondTeamLastResults != null ? 
                secondTeamLastResults.size() : 0); 
    }

    @Override
    public int getItemCount() {
        return getFirstTeamVSSecondTeamsSize() 
        + getFirstTeamLastResultsSize()
        + getSecondTeamLastResultsSize();
    }

    private MatchResults getItem(int i) {
        if (i < 0 || i > getItemCount())
            return null;
        if (i >= (getFirstTeamVSSecondTeamsSize() + getFirstTeamLastResultsSize())) {
            int pos = i - (getFirstTeamVSSecondTeamsSize() + getFirstTeamLastResultsSize());
            return secondTeamLastResults.get(pos);
        }
        else if (i >= getFirstTeamVSSecondTeamsSize()) {
            int pos = i - getFirstTeamVSSecondTeamsSize();
            return firstTeamLastResults.get(pos);
        }
        else {
            return firstTeamVSSecondTeams.get(i);
        }
    }

    @Override
    public FootballMatchAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ... 
    }

    @Override
    public void onBindViewHolder(@NonNull footballmatchadapter.ViewHolder 
        viewHolder, int i) {

        String leauge = "", date = "", team1 = "", team2 = "", team1score = "", team2score = "";
        MatchResult result = getItem(i);

        leauge = firstTeamVSSecondTeam.getLeagueName();
        date = "Match Date " + firstTeamVSSecondTeam.getMatchDate();
        team1 = "Home Team " + firstTeamVSSecondTeam.getMatchHometeamName();
        team2 = "Second Team " + firstTeamVSSecondTeam.getMatchAwayteamName();
        team1score = firstTeamVSSecondTeam.getMatchHometeamName() + " : "+firstTeamVSSecondTeam.getMatchHometeamScore();
        team2score = firstTeamVSSecondTeam.getMatchAwayteamName() + " : "+firstTeamVSSecondTeam.getMatchAwayteamScore();

        viewHolder.tvleague.setText(leauge);
        viewHolder.tvdate.setText(date);
        viewHolder.tvhometownteam.setText(team1);
        viewHolder.tvawayteam.setText(team2);
        viewHolder.tvhometeamscore.setText(team1score);
        viewHolder.tvawayteamscore.setText(team2score);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        ...
    }
}