java - Recyclerview 仅显示父对象的最后一项

标签 java android json

我正在 Android 改造中从 JSON 制作回收器 View 。一切正常。我的 JSON 看起来像这样。

这是我的 JSON 结构:

[
   {
      "ChallengeID":"1",
      "ChallengeName":"New Challenge Arrived",
      "ChallengeIcon":"icon.jpg",
      "BetID":"3",
      "challengeItem":[
         {
            "CallengeItemID":"5",
            "ChallengeID":"1",
            "MatchID":"845"
         },
         {
            "CallengeItemID":"6",
            "ChallengeID":"1",
            "MatchID":"844"
         },
         {
            "CallengeItemID":"7",
            "ChallengeID":"1",
            "MatchID":"843"
         },
         {
            "CallengeItemID":"8",
            "ChallengeID":"1",
            "MatchID":"842"
         },
         {
            "CallengeItemID":"9",
            "ChallengeID":"1",
            "MatchID":"841"
         }
      ]
   },
   {
      "ChallengeID":"2",
      "ChallengeName":"Tuesday Funday",
      "ChallengeIcon":"icon.jpg",
      "BetID":"3",
      "challengeItem":[
         {
            "CallengeItemID":"2",
            "ChallengeID":"2",
            "MatchID":"853"
         },
         {
            "CallengeItemID":"3",
            "ChallengeID":"2",
            "MatchID":"852"
         },
         {
            "CallengeItemID":"4",
            "ChallengeID":"2",
            "MatchID":"849"
         }
      ]
   },
   {
      "ChallengeID":"3",
      "ChallengeName":"Tuesday Funday",
      "ChallengeIcon":"icon.jpg",
      "BetID":"3",
      "challengeItem":[
         {
            "CallengeItemID":"2",
            "ChallengeID":"2",
            "MatchID":"853"
         },
         {
            "CallengeItemID":"3",
            "ChallengeID":"2",
            "MatchID":"852"
         }
      ]
   }
]

现在我想要显示的是每个 challengeItem 左侧的 ChallengeName

但它仅显示每个 challengeItem 的最后一个 ChallengeName。我的代码有什么问题。请帮我。我已经浪费了15个小时来解决这个问题。这是我的 recyclerview 适配器代码

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewholder> {

    ArrayList<ModelClass> datalist;
    ModelClass model;
    ArrayList<ChallengeItem> challengeItems;
    Context context;

    public RecyclerAdapter(FragmentActivity activity, ArrayList<ModelClass> items, ArrayList<ModelClass> datalist) {
        this.datalist = datalist;
        this.context=activity;
        this.challengeItems=new ArrayList<>();
        model=new ModelClass();

        for(ModelClass mc: datalist)
        {
            model = mc;
            System.out.println("model: " + model.getChallengeName());

        }

        for(ModelClass g : datalist) {
            //invoke any methods of each gun
            ArrayList<ChallengeItem> bullets = g.getChallengeItem();
            challengeItems.addAll(bullets);


            for(ChallengeItem b : bullets) {
                System.out.println("X: "+b.getMatchID());

            }
        }
    }

    @NonNull
    @Override
    public MyViewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.recycler_list,parent,false);
        return new MyViewholder(view);
    }



    @Override
    public void onBindViewHolder(@NonNull MyViewholder holder, int position) {

        holder.t2.setText( model.getChallengeName()+ " :" + challengeItems.get(position).getMatchID());
        holder.t3.setText(challengeItems.get(position).getCallengeItemID());


        holder.t2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                System.out.println("challenge name is :"+model.getChallengeName());
            }
        });

    }

    @Override
    public int getItemCount() {
        return challengeItems.size();
    }

    public class MyViewholder extends RecyclerView.ViewHolder {
        TextView t1,t2,t3;
        public MyViewholder(@NonNull View itemView) {
            super(itemView);
            t1=itemView.findViewById(R.id.chitemid);
            t2=itemView.findViewById(R.id.chalid);
            t3=itemView.findViewById(R.id.matchid);
        }
    }}

最佳答案

首先,你的代码非常困惑,其次我认为问题出在这一行

holder.t2.setText( model.getChallengeName()+ " :" + challengeItems.get(position).getMatchID());

model.getChallengeName() 替换为以下行

datalist.get(position).getModel().getChallengeName();

这是因为您在循环的构造函数中初始化模型,并且 model 保存 datalist 上最后一项的值。在 onBindViewHolder 中,使用我提到的格式直接从数据列表访问值。

关于java - Recyclerview 仅显示父对象的最后一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57697754/

相关文章:

java - 如何检查数组与参数的值是否相同?

android - 使用 ObjectAnimator 向上滑动动画

java - 使用 room 从两个表中获取一个对象中的两个列表

json - 将 JSON 数组解析为 Azure 逻辑应用中的各个变量

java - 创建类型 X 的通用字段并通过反射将其值设置为(不相关的)类型 Y 不会导致 IllegalArgumentException

java - 如何在 HttpSession 中存储 Java 对象?

java - 如何在java中恢复对象的引用。在下面的代码中,我已将 c1 分配给 c2。如何将具有 (50, 30) 值的对象恢复到 c2

android - BottomSheet 与 RecyclerView

java - 从 URL 读取 90 MB 的巨大文件

arrays - 修改 JSON 数组元素