【问题标题】:How to Get Selected Item Count, Select/De-Select all Items in Recyclerview WIth Checkboxes?如何使用复选框获取选定项目计数,选择​​/取消选择 Recyclerview 中的所有项目?
【发布时间】:2019-01-11 06:46:19
【问题描述】:

我有一个片段,其中包含一个回收视图中的项目列表。在它们下面是一个具有“不可见”状态的复选框。单击某个项目时,我会切换此状态。到目前为止,我已经完成了这项工作,但不确定我是否使用了最好的方法。

这里的问题是,我希望能够从片段工具栏中的主复选框中选中/取消选中所有项目,并获取已选和未选项目的总数并将它们发送到主机活动中显示。我总是得到错误的值,无法检查活动中的所有项目。这个实现对吗?

我已正确初始化所有视图并能够显示 lsit,但是当我尝试将带有值的方法从适配器视图持有者传递到父片段时,没有任何反应。

片段代码://跳过初始化

 public class MarkAttendanceFragment extends DialogFragment implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {

private static final String TAG = MarkAttendanceFragment.class.getSimpleName();

private Toolbar toolbar;
private ImageView closeIV;
private TextView sessionNameAttendanceTV, totalTV, presentTV, absentTV;
private Button doneBtn;

private CheckBox checkAll;

private RecyclerView attRV;
private MarkAttendanceAdapter adapter;
private List<PlayerSession> playersList = new ArrayList<>();

private int numPresent = 0, numAbsent = 0, sumPlayers = 0;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_mark_attendance, container, false);

    init(view);
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);

    closeIV.setOnClickListener(this);
    checkAll.setOnCheckedChangeListener(this);
    doneBtn.setOnClickListener(this);

    return view;
}

private void init(View view) {
    numPresent = adapter.sendNumChecked();
    Log.d(TAG, "Num Checked:\t" + numPresent);
    presentTV.setText(numPresent + "");

    sumPlayers = adapter.getItemCount();
    Log.d(TAG, "Sum Players:\t" + sumPlayers);
    totalTV.setText(sumPlayers + "");

    numAbsent = sumPlayers - numPresent;
    Log.d(TAG, "Num Absent:\t" + numAbsent);
    absentTV.setText(numAbsent + "");
  }

并使用片段复选框的复合按钮检查所有方法:

 @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if (isChecked) {
        adapter.checkAll();
    } else {
        adapter.unCheckAll();
    }
}

这是适配器方法:

 @Override
public void onBindViewHolder(final MarkAttendanceViewHolder viewholder, int position) {
    final PlayerSession players = itemsList.get(position);
    viewholder.namePlayerTV.setText(players.getFirstName() + " " + players.getLastName());
    Picasso.with(context)
            .load(players.getImageURL())
            .placeholder(R.drawable.app_logo_resized)
            .into(viewholder.playerAvatarIV);

    final boolean isClicked = players.isSelected();
    viewholder.playerAvatarIV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

    //                viewholder.checkBoxPlayer.setVisibility(isClicked ? View.VISIBLE : View.INVISIBLE);
   //                players.setSelected(!players.isSelected());
   //                players.setSelected(!isClicked);
   //                Log.d(TAG, "Sel Status " + players.isSelected());

   //                boolean isChecked = viewholder.checkBoxPlayer.isChecked();

            if (viewholder.checkBoxPlayer.isChecked()) {

    //                    if (selectedList.contains(players.getFirstName())) {
   //                        selectedList.remove(players.getFirstName());
   //                        Log.d(TAG, "Removed:\t" + players.getFirstName());
   //                    }

                viewholder.checkBoxPlayer.setChecked(false);
                viewholder.checkBoxPlayer.setVisibility(View.INVISIBLE);

            } else {
  //                    if (!selectedList.contains(players.getFirstName())) {
  //                        selectedList.add(players.getFirstName());
  //                        Log.d(TAG, "Added:\t" + players.getFirstName());
 //                    }
                viewholder.checkBoxPlayer.setChecked(true);
                viewholder.checkBoxPlayer.setVisibility(View.VISIBLE);
            }
        }
    });

    viewholder.checkBoxPlayer.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            Log.d(TAG, "Checked:\t" + isChecked);
            if (isChecked) {
                viewholder.checkBoxPlayer.setVisibility(View.VISIBLE);
                players.setSelected(isChecked);
                numPresent++;
                Log.d(TAG, "Checkbox visible:\t and count:\t" + numPresent);
            } else {
                viewholder.checkBoxPlayer.setVisibility(View.INVISIBLE);
                players.setSelected(isChecked);
                numPresent--;
                Log.d(TAG, "Checkbox invisible:\t and count:\t" + numPresent);
            }
        }
    });
}

@Override
public int getItemCount() {
    if (itemsList == null) {
        return 0;
    }
    return itemsList.size();
}

public void checkAll() {
    vh.checkBoxPlayer.setChecked(true);
}

public void unCheckAll() {
    vh.checkBoxPlayer.setChecked(false);
}

public int sendNumChecked() {
    return numPresent;
}     

片段中的文本视图应该从回收的视图适配器获得检查状态的动态更新,以及当所有项目都被选中或未选中时。我该如何完成这个实现?谢谢。

【问题讨论】:

    标签: android android-recyclerview android-checkbox


    【解决方案1】:

    我使用下面的方法,它对我有用。您现在已经定义了onCheckedChanged(),当使用检查/取消选中片段中的复选框时,我使用迭代器将特定值分配给我的数据源 ArrayList,并将适配器设置为列表。

    chk_select_all_users.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
       selectUsers(b);
    }
    });
    

    现在在selectUsers() 中检查布尔值是否为真/假并再次设置适配器。

    private void selectUsers(boolean check) {
        Iterator<PlayerSession> iterator = userdata.iterator();
        while (iterator.hasNext()) {
            PlayerSession temp = iterator.next();
            temp.setSelected(check);
        }
    
            //set adapter to list again.
    }
    

    您需要根据模型中设置的值选中列表项复选框。所以,把下面的代码放在 onBindViewHolder()

    if (userData.isSelected()) {
        viewholder.checkBoxPlayer.setChecked(true);
    } else {
        viewholder.checkBoxPlayer.setChecked(false);
    }
    

    【讨论】:

    • 我会试试你的答案,但是考虑到复选框首先是不可见的,onBindViewHolder 部分是如何工作的
    • 将此代码添加到您的工作代码中。您使可见/不可见的逻辑不会影响这一点。
    • 我应该从查看器中删除我检查的更改并替换为这个?你能用你的答案更新问题的那部分吗?比
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2015-02-13
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多