从SectionedRecyclerViewAdapter

问题描述

这是我第二天为此苦苦挣扎。我想在recyclerView中创建一个带有复选框的分段列表,所以我决定使用SectionedRecyclerViewAdapter。我遇到的第一个问题是,在GitHub的示例中,他们在onBindItemViewHolder方法内部使用了onClick方法。但是经过research之后,我得出的结论是,在onBindViewHolder中使用OnClick不是一个好习惯,而应该在ViewHolder中使用。但是,当我尝试使用getAdapterPosition()从该位置的列表访问对象时,它抛出outOfbounds异常。它是每个节的加载列表,但是getAdapterPosition返回所有合并列表中的位置值。

所以我认为好了,我将在onBindItemViewHolder内设置OnClickListener(尽管不推荐),以使用onBindItemViewHolder提供的位置并将其存储在数组中,以继续进行下一个活动。但是同样的问题是,它为每个适配器创建一个新的数组对象,而我不能作为一个数组访问。在这一点上,我不确定是否要继续执行此操作,因为总会出现一些新问题。也许对如何使这项工作有一些建议?

部分代码

  public class MySection extends Section {
    private Context context;
    private List<MyObject> myList;
    private ArrayList<MyObject> selectionList = new ArrayList<>();
    private String title;

  
    @Override
    public int getContentItemsTotal() {
        return myList.size();
    }

    public MySection(Context ctx,String categoryTitle,List<MyObject> myList){
        super(SectionParameters.builder().itemResourceId(R.layout.category_row).headerResourceId(R.layout.category_header).build());
        this.context = ctx;
        this.myList = myList;
        this.title = categoryTitle;

    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
        public TextView rowTitle;
        public ImageView rowIcon;
        public CheckBox checkBox;

        public MyViewHolder(@NonNull final View itemView,Context ctx) {
            super(itemView);
            context = ctx;

            rowTitle = itemView.findViewById(R.id.row_title);
            rowIcon = itemView.findViewById(R.id.row_icon);
            checkBox = itemView.findViewById(R.id.checkBox_row);
            
        }
    }

    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {

        return new MyViewHolder(view,context);
    }

    @Override
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder,final int position) {
        final MyViewHolder itemHolder = (MyViewHolder) holder;
        final MyObject ob = myList.get(position);
        itemHolder.rowTitle.setText(ob.getType());
        itemHolder.rowIcon.setBackground(ob.getIcon());

        if(ob.getSelected()){
            itemHolder.checkBox.setChecked(true);
        }else{
            itemHolder.checkBox.setChecked(false);
        }
        
        itemHolder.checkBox.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int pos = position;
                if(myList.get(pos).getSelected()){
                    selectionList.remove(myList.get(pos));
                    myList.get(pos).setSelected(false);
                }else{
                    myList.get(pos).setSelected(true);
                    selectionList.add(myList.get(pos));
                }
            }
        });



    }

    //methods for category title
    public class TitleViewHolder extends RecyclerView.ViewHolder{
        public TextView categoryTitle;
        public TitleViewHolder(@NonNull View itemView) {
            super(itemView);

            categoryTitle = (TextView) itemView.findViewById(R.id.category_header);

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

    @Override
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
       TitleViewHolder itemHolder = (TitleViewHolder) holder;
        itemHolder.categoryTitle.setText(title);
    }
}

活动代码

public class Categories extends AppCompatActivity {
private SectionedRecyclerViewAdapter sectionAdapter;
private RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_categories);

    sectionAdapter = new SectionedRecyclerViewAdapter();
    List<Tool> firstList = MyObject.getfirstList(this);
    List<Tool> secondList = MyObject.getSecondList(this);
    List<Tool> thirdList = MyObject.getThirdList(this);
    List<Tool> fourthList = MyObject.getFourthList(this);

    MySection firstSection = new MySection(this,"First title",firstList);
    MySection secondSection = new MySection(this,"Second title",secondList);
    MySection thirdSection = new MySection(this,"Third title",thirdList);
    MySection fourthSection = new MySection(this,"Fourth title",fourthList);

    sectionAdapter.addSection(firstSection);
    sectionAdapter.addSection(secondSection);
    sectionAdapter.addSection(thirdSection);
    sectionAdapter.addSection(fourthSection);

    recyclerView = findViewById(R.id.category_recycler_view);


}

@Override
protected void onStart() {
    super.onStart();
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new linearlayoutmanager(this));
    recyclerView.setAdapter(sectionAdapter);
    sectionAdapter.notifyDataSetChanged();
}

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...