java - findViewHolderForAdapterPosition 返回 null

标签 java android android-recyclerview sectionedrecyclerviewadapter

我正在使用SectionedRecyclerViewAdapter,并且我传递给myAdapter两个部分

第一部分有 16 个元素,第二部分有 18 个元素

每个元素都有 CheckBox 项目,我尝试调用将所有项目设置为选中的方法,但是当对其进行循环并获取项目编号 17 时,它返回 null

但是我的mRecyclerView实际上总共有34个项目

那么如何移动到其他部分并获取元素号 17。

            sectionAdapter = new SectionedRecyclerViewAdapter();
    ArrayList<Item> contacts = new ArrayList<>();
   // ArrayList<String> dishNames = new ArrayList<>();
    mRecyclerView.setLayoutManager(new LinearLayoutManager(mActivity));

    for(int d = 0 ; d<DishesIngredientsShoppingList.size() ;d++) {
        contacts =  new ArrayList<>();
        for (int i = 0; i < DishesIngredientsShoppingList.get(d).getGroups().length; i++) {
            for (int g = 0; g < DishesIngredientsShoppingList.get(d).getGroups()[i].getIngredients().length; g++) {
                contacts.add(new Item(DishesIngredientsShoppingList.get(d).getGroups()[i].getIngredients()[g].getName()));
            }
        }
        sectionAdapter.addSection(new ContactsSection(DishesIngredientsShoppingList.get(d).getName(),contacts));
   //     contacts.clear();
    }


  class ContactsSection extends StatelessSection {

    String title;
    List<Item> list;
    ItemViewHolder row;
    HeaderViewHolder MainRow;
    public ContactsSection(String title, ArrayList<Item> list) {
        super(R.layout.shopping_row_item_header, R.layout.shopping_row_item);

        this.title = title;
        this.list = list;
    }

    @Override
    public int getContentItemsTotal() {
        return list.size(); // list here has 16 elements !! it should 34 elements 
    }

    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindItemViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        final ItemViewHolder itemHolder = (ItemViewHolder) holder;
        final Item name = list.get(position);
        itemHolder.tvItem.setText(name.name);
        ((ItemViewHolder) holder).IntegBOX.setChecked(name.checked);



        chooseAllradioButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {




                for (int i = 0; i <sectionAdapter.getItemCount(); i++) {
                    final Item name = list.get(i);
                    name.checked = true;
                    sectionAdapter.notifyDataSetChanged();
                }



            }
        });

    @Override
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
        return new HeaderViewHolder(view);
    }

    @Override
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
        HeaderViewHolder headerHolder = (HeaderViewHolder) holder;

        headerHolder.tvTitle.setText(title);
    }
    }

    class HeaderViewHolder extends RecyclerView.ViewHolder {

        private final TextView tvTitle;
        private final CheckBox DishBOX;
        public HeaderViewHolder(View view) {
            super(view);

            tvTitle = (TextView) view.findViewById(R.id.DishName);
            DishBOX = (CheckBox) view.findViewById(R.id.chooseDish);
        }
    }

    class ItemViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener{

        private final View rootView;
        private final TextView tvItem;
        private final CheckBox IntegBOX;
        public ItemViewHolder(View view) {
            super(view);

            rootView = view;
            tvItem = (TextView) view.findViewById(R.id.DishName);
            IntegBOX = (CheckBox) view.findViewById(R.id.chooseDish);
            IntegBOX.setOnCheckedChangeListener(this);
        }

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            int position = getAdapterPosition();
            list.get(position).checked = isChecked;
        }
    }


    }
class Item {
    String name;
    boolean checked;

    public Item(String name) {
        this.name = name;
        checked = false;
    }
}

最佳答案

在 ContactsSection 类中添加一个方法来检查所有项目:

public void checkAllItems() {
    for (Item item : list) {
        item.checked = true;
    }
}

然后将您的 onClick 代码更改为:

chooseAllradioButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        for(Section section : sectionAdapter.getSectionsMap().values()) {
            section.checkAllItems();    
        }
        sectionAdapter.notifyDataSetChanged();

    }
});

关于java - findViewHolderForAdapterPosition 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37220958/

相关文章:

java - Java 的 SCons;是否有 env.Program() 的类似物?

java - 在 gridLayout 中设置 JButton 大小

android decodeResource 为 xml 位图返回 null - API 级别 7

java - 无法从 java cocos2dx 调用 c++ 函数

android - RecyclerView notifyItemRangeChanged 不显示新数据

android - 回收站查看致命异常 : java. lang.ArrayIndexOutOfBoundsException

java - 为什么 treemap 在 Get/put 中需要 O(log(n)) 时间

java - 是否可以在一个节点上运行多个 Selenium 测试?

android - BottomSheet 与 ViewPager 和 fragment ?

android - Recycler View 仅显示 android 中共享首选项中的一项