问题描述
这是我第二天为此苦苦挣扎。我想在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 (将#修改为@)