从Fragment中的适配器(recyclerview)获取所有项目

时间:2016-06-03 15:39:06

标签: android android-fragments checkbox fragment android-recyclerview

您好我的片段中从我的适配器获取所有项目时遇到问题。更具体地说,我正在使用ScaleInAnimatorAdapter和我的客户适配器,当我尝试从下面发布的代码中获取我的复选框项目时,在我的片段中,我似乎只在屏幕上显示可见项目。

private View.OnClickListener onAllClick = new View.OnClickListener() {
    @Override public void onClick(View v) {
        int count = listAdapter.getItemCount();

        for (int i = 0; i < count; i++) {
            View mChild = listTopics.getChildAt(i);

            if( mChild != null ) {
                Log.d(TAG,"getItemCount(): " + i );

                CheckBox cBox = (CheckBox)mChild.findViewById(R.id.topic_chk);
                cBox.setChecked(((CheckBox) v).isChecked());
                Log.d(TAG,"isChecked" + cBox.getTag());
                cBox.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(((CheckBox) v).isChecked()) {
                            checkboxAll.setChecked(false);
                        }
                    }
                });
            }
        }
    }
};

基本上我正在尝试从片段创建一个check all all功能,这样当单击它时,将检查适配器中的所有复选框项。我得到了使用我提供的代码,但主要问题是我只能在屏幕上看到项目,所以当我滚动到我的其他项目时,他们不会被检查。因此,我想知道是否有更好的方法或其他方式让我获得所有项目

4 个答案:

答案 0 :(得分:2)

适配器旨在将基础数据存储绑定到视图;它们通常不应该用于存储数据本身(除了为视图绑定目的提供数据副本),也不应该对数据执行操作。

相反,您应该修改基础数据,然后通过您已经使用的任何机制更新适配器。 (加载器,带有notifyDataItemChanged的自定义setter等)。

答案 1 :(得分:1)

基本上你不能。它将重用 UI视图。 您需要在所有数据列表对象中设置一个标志,调用notifyDataSetChanged()onBindViewHolder检查该标志并使用它来检查取消选中

if(listAdapter.getItem(position).getIsChecked())
    viewHolder.checkBox.setChecked(true);
else
   viewHolder.checkBox.setChecked(false);

答案 2 :(得分:1)

确定。感谢所有回复的人,帮助我掌握了一些非常基本和重要的东西。

我得到了它的工作,所以对于任何可能阅读这篇文章的人来说,这是我的解决方案:

  • 创建必要的方法和字段以更新模型中的数据(即私有is_checked,set_checked(),is_checked()等)
  • 在适配器onBindViewHolder中,您将设置持有人复选框以与数据关联,如下所示:

    holder.checkBox.setOnCheckedChangeListener(new  CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            obj.setSelected(buttonView.isChecked());
        }
    });
    holder.checkBox.setChecked(obj.isSelected());
    
  • 然后在你的片段或活动中我只在我的主复选框上有一个点击监听器,然后在检查时我遍历我的数据列表,并使用模型方法我更新我的数据,只需使用 listAdapter.notifyDataSetChanged ()

答案 3 :(得分:0)

你这样做错了。 您应该更新适配器,而不是更新复选框视图。

您可以做什么,您可以在适配器数据持有者中创建一个字段。

无论何时更改选择,只需更新字段或多个字段,最后刷新视图。