首页 > 解决方案 > 为什么在 RecyclerView findViewByPosition() 在 EditText 上返回 null

问题描述

我有一个Activity,其中有一个RecyclerView和保存Button。的每个项目(足球比赛)都RecyclerView包含一些文本(球队名称)和EditText,用户在其中输入数据(实际上是投注比赛)。Activity我的目标是在用户单击保存时将这些分数保存到列表中Button

我在 中实现了这个方法Activity,它实际上从 中获取特定项目LinearLayoutManager,然后从中获取数据EditText,但是该findViewByPosition()方法(或 getChildAt() 有不同的方法来执行此操作)有时会返回 null。

我在类似问题上看到了另一个答案,但他们没有帮助我。也许我的策略是错误的,因为我在 Activity 中完成了我的逻辑(最好在 Adapter 中执行此操作?)并且RecyclerView即使只有一个用户输入了分数,我也可以通过我的所有项目。

    private List<Bet> getUserBets() {
        View betView;
        Bet betItem;
        EditText userBet1;
        EditText userBet2;

        int numberOfMatches = rvBetsAdapter.getItemCount();
        List<Bet> bets = new ArrayList<>();

        for (int i = 0; i < numberOfMatches; i++)
        {
            betItem = rvBetsAdapter.getItem(i);
            betView = linearLayoutManager.findViewByPosition(i); 
            userScore1 = (EditText) betView.findViewById(R.id.result1); // <- NPE appears
            userScore2 = (EditText) betView.findViewById(R.id.result2);
            //here i checked whether the editText is empty and other stuff
            bets.add(betItem);
        }
        return bets;
    }

我如何解决它?我想我应该在我的适配器的 onBindViewHolder 方法中做一些事情,但究竟是什么?我真的很感激任何帮助。

标签: androidandroid-activityandroid-recyclerview

解决方案


您应该添加到您的Bet模型变量中EditText,例如保存值editTextValue

并使用适配器列表中的列表访问它,就像EditText从那里的最终使用值一样。rvBetsAdapter.getItem(i).editTextValue

editTextValue可以使用TextWatcher.afterTextChanged()回调设置


推荐阅读