代码之家  ›  专栏  ›  技术社区  ›  Hashir Saeed

单击单个项目,选择回收器视图中的所有项目

  •  3
  • Hashir Saeed  · 技术社区  · 8 年前

    我会稍微解释一下我的问题。有一个 在我的“回收器”视图布局中,一开始谁是不可见的。当我单击“回收器”视图中的一个项目时,我希望 复选框 在所有项目中可见。我在网上搜索太久了,找不到解决问题的方法。


    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 文本。我可以通过逐个单击项来更改复选框的可见性。我只想改变它的所有项目上的一次点击。就像手机里的联系人列表一样。你只要长按项目和复选框出现在所有的项目。任何帮助都将不胜感激。

    3 回复  |  直到 8 年前
        1
  •  4
  •   TheWanderer    8 年前

    将新字段添加到 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()

        2
  •  1
  •   Sunny    8 年前

    您需要在中添加一个布尔变量 ViewAllInventoryDevicesDetails class checkbox 是否选中 boolean isCheckSelected=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);
            }
    
        }
    }
    

        3
  •  0
  •   Nilesh Panchal    8 年前

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

    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();
                }
            });