单击一个项目如何在 Recycler View 中选择所有项目

4

让我稍微解释一下我的问题。在我的回收视图布局中有一个复选框,它在开始时是不可见的。当我点击回收视图中的某个项目时,我希望所有项目中的复选框都可见。我已经在互联网上搜索了很久,但无法找到解决方法。


public class ViewInventoryListAdapter extends RecyclerView.Adapter<ViewInventoryListAdapter.ListViewHolder> {

private Context context;
List<ViewAllInventoryDevicesDetails> list;
private Button assignButton;
private UserLoginResponseModel userLoginResponseModel;
private android.support.v4.app.Fragment fragment;
private FragmentManager fragmentManager;
private FragmentActivity myContext;
private Activity activity;
private int counter = 0;
private List<String> selectedDeviceSerialNumbers;
private static CheckBox checkBox;

public ViewInventoryListAdapter(Context context, List<ViewAllInventoryDevicesDetails> list, Button assign, UserLoginResponseModel model, Activity activity ) {
    this.context = context;
    this.list = list;
    this.assignButton = assign;
    this.userLoginResponseModel = model;
    this.activity =activity;
}

@NonNull
@Override
public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.view_all_inventory_listlayout_cardview,null);
    //Specifying Activity for Fragment Transaction
    activity = activity;
    myContext = (FragmentActivity) activity;
    //Iniallizing Fragment Manager
    fragmentManager = myContext.getSupportFragmentManager();
    selectedDeviceSerialNumbers = new ArrayList<>();
    checkBox =  view.findViewById(R.id.view_inventory_checkbox);
    return new ViewInventoryListAdapter.ListViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ListViewHolder holder, final int position) {
    Typeface iconFont = FontManager.getTypeface(context, FontManager.FONTAWESOME);
    holder.deviceSerialNumber.setText(list.get(position).getSerialNumber());
    holder.deviceType.setText(list.get(position).getDeviceType());
    FontManager.markAsIconContainer(holder.deviceIcon, iconFont);
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {

            holder.isSelected.setVisibility(View.VISIBLE);
            //holder.isSelected.setVisibility(View.VISIBLE);
            holder.isSelected.setChecked(true);

            assignButton.setVisibility(View.VISIBLE);

            return false;
        }
    });
  holder.isSelected.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
          holder.isSelected.setChecked(false);
          holder.isSelected.setVisibility(View.INVISIBLE);
          //Login For Visibility For assign Button
          counter--;
          selectedDeviceSerialNumbers.remove(list.get(position).getSerialNumber());
          if(counter == 0){
              assignButton.setVisibility(View.GONE);
          }
      }
  });

  assignButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
          Bundle bundle = new Bundle();
          if(userLoginResponseModel != null){
              bundle.putSerializable("UserModel", userLoginResponseModel);
              bundle.putSerializable("serialNumbers", (Serializable) selectedDeviceSerialNumbers);
          }
          fragment = new AssingSelectedDevicesFragment();
          fragment.setArguments(bundle);
          fragmentManager.beginTransaction()
                  .replace(R.id.flContent, fragment)
                  .commit();
      }
  });

}

@Override
public int getItemCount() {
    return list.size();
}

class ListViewHolder extends RecyclerView.ViewHolder{

    private TextView deviceType, deviceSerialNumber, deviceIcon;
    private CheckBox isSelected;

    public ListViewHolder(View itemView){
        super(itemView);
        deviceType = itemView.findViewById(R.id.view_inventory_deviceType_textview);
        deviceSerialNumber = itemView.findViewById(R.id.view_inventory_serialNumber_textview);
        deviceIcon         = itemView.findViewById(R.id.view_inventory_image_textview);
        isSelected         = itemView.findViewById(R.id.view_inventory_checkbox);
    }

    }

 }

这是我的OnBindViewHolder文本。我可以点击单个项目以改变复选框的可见性。我只想在单击时为所有项目更改。就像我们手机上的联系人列表一样。您只需长按项目,所有项目中都会出现复选框。任何帮助都将不胜感激。 最好的问候


等一下,我马上做。 - Hashir Saeed
请你看一下@TheWanderer。 - Hashir Saeed
1
可能是更改RecyclerView中所有项的视图可见性的重复问题。 - ʍѳђઽ૯ท
@HashirSaeed,请检查我的答案。 - TheWanderer
非常感谢大家!我刚刚解决了这个问题。@ʍѳђઽ૯ท,感谢您的回复。我在stackoverflow上搜索了无穷大,但就是找不到正确的答案。再次感谢。 - Hashir Saeed
显示剩余5条评论
3个回答

6

我是一名有帮助的助手,可以为您进行翻译。

以下是我处理此类问题的方法:

向您的ViewAllInventoryDevicesDetails类中添加一个新字段:

public boolean showCheckbox = false;

为您的适配器添加一些帮助方法:

private void showAllBoxes() {
    for (ViewAllInventoryDevicesDetails item : list) {
        item.showCheckbox = true;
    }
    notifyDataSetChanged();
}

private void hideAllBoxes() {
    for (ViewAllInventoryDevicesDetails item : list) {
        item.showCheckbox = false;
    }
    notifyDataSetChanged();
}

然后,在你的onBindViewHolder()方法中使用该标志:
@Override
public void onBindViewHolder(@NonNull final ListViewHolder holder, final int position) {
     ViewAllInventoryDevicesDetails item = list.get(position);
     holder.isSelected.setVisibility(item.showCheckbox ? View.VISIBLE : View.GONE);
}

您只需在需要显示所有框时调用showAllBoxes(),并在需要隐藏所有框时调用hideAllBoxes().


非常感谢你,伙计!我只是使用了布尔标志逻辑。非常感谢你的帮助。 - Hashir Saeed

1

您需要在 ViewAllInventoryDevicesDetails class 中添加一个布尔变量来检查项目是否已选择以及 checkbox 是否已选择 boolean isCheckSelected = false; // 默认值为false,因为起始时未选择任何值。

这里我修改了您的代码:

public class ViewInventoryListAdapter extends RecyclerView.Adapter<ViewInventoryListAdapter.ListViewHolder> {

    private Context context;
    List<ViewAllInventoryDevicesDetails> list;
    private Button assignButton;
    private UserLoginResponseModel userLoginResponseModel;
    private android.support.v4.app.Fragment fragment;
    private FragmentManager fragmentManager;
    private FragmentActivity myContext;
    private Activity activity;
    private int counter = 0;
    private List<String> selectedDeviceSerialNumbers;
    private static CheckBox checkBox;
    private int selectedItem = -1; // -1 due to first time nothing selected


    public ViewInventoryListAdapter(Context context, List<ViewAllInventoryDevicesDetails> list, Button assign, UserLoginResponseModel model, Activity activity) {
        this.context = context;
        this.list = list;
        this.assignButton = assign;
        this.userLoginResponseModel = model;
        this.activity = activity;
    }

    @NonNull
    @Override
    public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.view_all_inventory_listlayout_cardview, null);
        //Specifying Activity for Fragment Transaction
        activity = activity;
        myContext = (FragmentActivity) activity;
        //Iniallizing Fragment Manager
        fragmentManager = myContext.getSupportFragmentManager();
        selectedDeviceSerialNumbers = new ArrayList<>();
        checkBox = view.findViewById(R.id.view_inventory_checkbox);
        return new ViewInventoryListAdapter.ListViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ListViewHolder holder, final int position) {
        Typeface iconFont = FontManager.getTypeface(context, FontManager.FONTAWESOME);
        holder.deviceSerialNumber.setText(list.get(position).getSerialNumber());
        holder.deviceType.setText(list.get(position).getDeviceType());
        FontManager.markAsIconContainer(holder.deviceIcon, iconFont);

        if (selectedItem != -1 && selectedItem == position) {
            holder.isSelected.setVisibility(View.VISIBLE);
            //holder.isSelected.setVisibility(View.VISIBLE);
            assignButton.setVisibility(View.VISIBLE);
        } else {
            holder.isSelected.setVisibility(View.GONE);
            assignButton.setVisibility(View.GONE);
        }

        if (selectedDeviceSerialNumbers.get(position).getCheckSelected()) {
            holder.isSelected.setChecked(true);
        } else {
            holder.isSelected.setChecked(true);
        }


        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                if (selectedItem != -1) {
                    selectedItem = position;
                    showAllBoxes();
                } else {
                    selectedItem = -1;
                    hideAllBoxes();
                }


                return false;
            }
        });
        holder.isSelected.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                selectedDeviceSerialNumbers.get(position).setCheckSelected(!selectedDeviceSerialNumbers.get(position).getCheckSelected());
            notifyDataSetChanged(); 
            }
        });

        assignButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Bundle bundle = new Bundle();
                if (userLoginResponseModel != null) {
                    bundle.putSerializable("UserModel", userLoginResponseModel);
                    bundle.putSerializable("serialNumbers", (Serializable) selectedDeviceSerialNumbers);
                }
                fragment = new AssingSelectedDevicesFragment();
                fragment.setArguments(bundle);
                fragmentManager.beginTransaction()
                        .replace(R.id.flContent, fragment)
                        .commit();
            }
        });

    }

    private void showAllBoxes() {
        for (ViewAllInventoryDevicesDetails item : list) {
            item.showCheckbox = true;
        }
        notifyDataSetChanged();
    }

    private void hideAllBoxes() {
        for (ViewAllInventoryDevicesDetails item : list) {
            item.showCheckbox = false;
        }
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class ListViewHolder extends RecyclerView.ViewHolder {

        private TextView deviceType, deviceSerialNumber, deviceIcon;
        private CheckBox isSelected;

        public ListViewHolder(View itemView) {
            super(itemView);
            deviceType = itemView.findViewById(R.id.view_inventory_deviceType_textview);
            deviceSerialNumber = itemView.findViewById(R.id.view_inventory_serialNumber_textview);
            deviceIcon = itemView.findViewById(R.id.view_inventory_image_textview);
            isSelected = itemView.findViewById(R.id.view_inventory_checkbox);
        }

    }
}

我希望它能对你有所帮助。


1
非常感谢您,伙计。这确实帮了我一大忙。 :) - Hashir Saeed

0

你也可以通过使用回调(接口)来实现这一点。

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;

import java.util.ArrayList;

public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ListViewHolder> {

    ArrayList<ListItemModel> myArrayList;
    ListClicklistener listClicklistener;

    public MyListAdapter(ArrayList<ListItemModel> myArrayList, ListClicklistener listClicklistener) {
        this.myArrayList = myArrayList;
        this.listClicklistener = listClicklistener;
    }

    @NonNull
    @Override
    public ListViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return new ListViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, viewGroup, false));
    }

    @Override
    public void onBindViewHolder(@NonNull ListViewHolder listViewHolder, int i) {
        listViewHolder.tvTitle.setText(myArrayList.get(i).title);

        if (myArrayList.get(i).isCheckBoxShow) {
            listViewHolder.chkBox.setVisibility(View.VISIBLE);
        }
        listViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listClicklistener.onListItemClick();
            }
        });
    }

    @Override
    public int getItemCount() {
        return myArrayList.size();
    }

    public class ListViewHolder extends RecyclerView.ViewHolder {
        TextView tvTitle;
        CheckBox chkBox;

        public ListViewHolder(@NonNull View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.tvTitle);
            chkBox = itemView.findViewById(R.id.chkBox);
        }
    }
}

取一个接口

public interface ListClicklistener {
    void onListItemClick();
}

使用回调函数的SetAdapter

myListAdapter = new MyListAdapter(myArrayList, new ListClicklistener() {
            @Override
            public void onListItemClick() {
                for (int i = 0; i < myArrayList.size(); i++) {
                    myArrayList.get(i).isCheckBoxShow = true;
                }
                myListAdapter.notifyDataSetChanged();
            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接