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

Posted

技术标签:

【中文标题】从 Fragment 中的适配器(recyclerview)获取所有项目【英文标题】:Get all items from adapter (recyclerview) in Fragment 【发布时间】:2016-10-03 18:15:44 【问题描述】:

您好,我在从片段中的适配器获取所有项目时遇到问题。更具体地说,我正在使用 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);
                        
                    
                );
            
        
    
;

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

【问题讨论】:

【参考方案1】:

适配器旨在将底层数据存储绑定到视图;它们通常不应该用于自己存储数据(除非拥有数据副本用于视图绑定),也不应该对数据执行操作。

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

【讨论】:

好的,我知道了。由于某种原因,我误解了这个概念。因此,如果我对您的理解正确,那么我应该例如在我的模型中使用 setChecked、isChecked 和 toggleChecked 来更新数据,并且在我的适配器中有一些其他方法将根据该数据更新相应复选框的视图。 【参考方案2】:

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

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

【讨论】:

您好,感谢您的回复。所以我在我的视图持有者中初始化了一个标志,它设置在 onBindViewHolder 上。所以现在在我的片段中,我应该检查每个项目上的标志,然后更新标志,在视图上设置复选框并调用 notifyDataSetChanged 以便更新我的 recyclerview 数据。你说的就是这种吗?如果此评论中缺少代码没有帮助,请致歉 是的。但是我不明白这部分“在视图上设置复选框”.. 休息似乎没问题。 所以就像在视觉上设置它一样,所以在视图上设置复选框,我的意思是取消选中并选中。您的 viewholder 对象,您是在初始化 view 对象,然后使用 final TopicsListViewHolder holder = (TopicsListViewHolder) v.getTag();或者有更好的方法吗?【参考方案3】:

好的。感谢所有回复的人,你们帮助我掌握了暗示我的一些非常基本和重要的东西。

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

创建必要的方法和字段来更新模型中的数据(即私有 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.notifydatasethanged ()

【讨论】:

【参考方案4】:

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

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

每当您更改选择时,只需更新字段或多个字段,最后刷新视图。

【讨论】:

以上是关于从 Fragment 中的适配器(recyclerview)获取所有项目的主要内容,如果未能解决你的问题,请参考以下文章

从 Fragment 获取 Activity 中的适配器

Android:从 viewPager 中的 Fragment 为 ListView 的适配器调用 getview()

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

如何从 MainActivity 中的 Fragment 访问适配器?我正在使用带有 viewpager 的标签,所以没有交易等方法

滚动 Recycler View 时有意丢失数据

访问 Recycler´s Adapter 中的 ViewModel