簡體   English   中英

未單擊時選中“ Recyclerview”復選框

[英]Recyclerview checkbox are checked when not clicked

我有一個帶有復選框的Recyclerview。 當用戶選中一個框時,當他們向下滾動時,另一個框將被選中。 我知道為什么,因為那個盒子被回收了,這很有意義。

但是我在設置它時遇到問題,因此它不這樣做:

我當前的onBindViewHolder:

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position){

    holder.playerNameNumber.setText(playerData.get(position).name + "\n" +playerData.get(position).number );

    holder.pickedPlayer.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View thisView){
            PlayerDetails contact = new PlayerDetails();
            int contactPos = position;
            if(holder.pickedPlayer.isChecked()) {

                contact.number = playerData.get(position).number;
                contact.name = playerData.get(position).name;
                playerListGame.addPlayer(contact);
                String name = contact.name;
                Toast.makeText(thisView.getContext(), name + " Added", Toast.LENGTH_LONG).show();
                holder.pickedPlayer.setChecked(true);
            }
           else if(!holder.pickedPlayer.isChecked()){
                contact.number = playerData.get(position).number;
                contact.name = playerData.get(position).name;
                for(PlayerDetails i : playerListGame.myPlayers){
                    if(i.name == contact.name && i.number == contact.number){
                        contactPos = playerListGame.myPlayers.indexOf(i);
                    }
                }
                playerListGame.removePlayer(contactPos);
                String name = contact.name;
                Toast.makeText(thisView.getContext(), name + " Removed", Toast.LENGTH_LONG).show();
            }

        }

    });


}

現在我知道SetIsRecyclable是一個很大的問題,盡管它確實解決了我的問題:

  public ViewHolder(View v){
            super(v);
            playerNameNumber = v.findViewById(R.id.playerDetails);
            pickedPlayer =v.findViewById(R.id.
              this.setIsRecyclable(false); 

如何避免使用這種方法來解決此問題?

您還必須在數據集中使用布爾值。因此,當用戶選中或取消選中某個框時,該時間會更新受關注位置的數據集的布爾值,並調用通知項已更改

arraylist.get(pos).setDataCheked(true);
notifyItemChanged(pos);
        holder.pickedPlayer.setOnCheckedChangeListener(null);
        //define private boolean selected with setter and getter
        holder.pickedPlayer.setChecked(playerData.isSelected());
        holder.pickedPlayer.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
        {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
            {
            playerData.setSelected(isChecked);
            if (isChecked)
            {
               Toast.makeText(context,"checked", Toast.LENGTH_LONG).show();
            }
            else
            {
                Toast.makeText(context,"not checked", Toast.LENGTH_LONG).show();
            }
            }
        });

您需要設置復選框的當前值,就像設置播放器名稱和編號一樣。 我假設它的名稱類似於在playerData中選擇的名稱。

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {

    holder.playerNameNumber.setText(playerData.get(position).name + "\n" +playerData.get(position).number );
    holder.pickedPlayer.setChecked(playerData.get(position).picked);

    // same onclick listener, removed for readability
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM