【问题标题】:Unable to allow user to check one checkbox at a time无法允许用户一次选中一个复选框
【发布时间】:2019-02-09 21:21:49
【问题描述】:

我实施了一个分段回收视图,效果很好。我想在显示在一个部分下的所有项目中包含一个复选框。我现在要实现的是允许用户一次检查一个复选框。我也尝试了单选按钮,但问题仍然存在,因为我无法抓住听众。

我在 stackoverflow 上搜索过它,但我无法让它工作。 getTag() 给了我一个空指针异常,我也尝试保留一个 selectedPosition 变量并尝试但我无法让 getTag() 工作。

public class HeaderRecyclerViewSection extends StatelessSection {
    private static final String TAG = HeaderRecyclerViewSection.class.getSimpleName();
    private String title;
    private List<RestaurauntMenuItemDetail> list;

    private List<RestaurauntMenuItemDetail> checkedList;

    private int selectedPosition = -1;


    public HeaderRecyclerViewSection(String title, List<RestaurauntMenuItemDetail> list) {
        super(R.layout.section_ex1_header, R.layout.layout_section_item);
        this.title = title;
        this.list = list;
    }
    @Override
    public int getContentItemsTotal() {
        return list.size();
    }
    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {

        return new ItemViewHolder(view);
    }


    @Override
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, final int position) {
        final ItemViewHolder iHolder = (ItemViewHolder)holder;
        iHolder.variationItemName.setText(list.get(position).getVariationItemName());
        iHolder.variationItemPrice.setText(Double.toString(list.get(position).getVariationItemPrice()));
        iHolder.checkBox.setOnCheckedChangeListener(null);
        iHolder.checkBox.setChecked(list.get(position).isSelected());

        Log.i("EXECUTED AGAIN","AGAIN");
        iHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
         @Override
         public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

                if(selectedPosition == position){

                    list.get(selectedPosition).setSelected(false);
                    iHolder.checkBox.setChecked(list.get(selectedPosition).isSelected());
                }
                list.get(position).setSelected(b);
                Log.i("POSITION is",Integer.toString(position));
                Log.i("B Is",Boolean.toString(b));
                selectedPosition = position;



         }
     });
    }

    @Override
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
        return new HeaderViewHolder(view);
    }
    @Override
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
        HeaderViewHolder hHolder = (HeaderViewHolder)holder;
        hHolder.headerTitle.setText(title);
    }
    }

我的 ItemHolder 类:

public class ItemViewHolder extends RecyclerView.ViewHolder{
    public TextView variationItemName;
    public TextView variationItemPrice;
    CheckBox checkBox;

    public ItemViewHolder(View itemView) {
        super(itemView);
        variationItemName = (TextView)  itemView.findViewById(R.id.variationItemName);
        variationItemPrice = (TextView) itemView.findViewById(R.id.variationItemPrice);
        checkBox = itemView.findViewById(R.id.checkBox2);
    }
}

我想要实现的是让用户能够在某个部分下选择一个复选框。

编辑 1:

这是当前我的屏幕使用单选按钮或复选框时的外观。

编辑 2: 我更改了我的代码如下,这让我可以一次检查一个单选按钮。问题是,当您单击回收站视图列表中的最后一项时,单选按钮不会被选中,如果选中,那么当您向上滚动时,它就会消失。

   @Override
    public void onBindItemViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        final ItemViewHolder iHolder = (ItemViewHolder)holder;
        iHolder.variationItemName.setText(list.get(position).getVariationItemName());
        iHolder.variationItemPrice.setText(Double.toString(list.get(position).getVariationItemPrice()));

        iHolder.variationItemPrice.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.i("I WAS CLICKED","ITEM PRICE WAS CLICKED");
            }
        });

        iHolder.radioButton.setChecked(list.get(position).isSelected());
        iHolder.radioButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.i("I was pressed","BUtton");




            RadioButton rb = (RadioButton) view;

            if(rb.isChecked()){
                Log.i("CONTAINS",Boolean.toString(radioButtonList.contains(rb)));
                if(position >= radioButtonList.size()){
                    radioButtonList.add(rb);
                    rb.setChecked(true);
                    list.get(position).setSelected(true);
                }else{


                }

                //list.get(position).setSelected(true);

            }

            for (int i = 0; i < radioButtonList.size(); i++) {
                RadioButton nrb = radioButtonList.get(i);
                if(i != position){
                    if(nrb.isChecked()){
                        nrb.setChecked(false);
                        list.get(i).setSelected(false);
                    }
                }
            }

            Log.i("RADIO LIST",Integer.toString(radioButtonList.size()));
            for (int i = 0; i < radioButtonList.size(); i++) {
                Log.i("RADIO CHECKED",Boolean.toString(radioButtonList.get(i).isChecked()));
            }
            Log.i("CURRENT POST",Integer.toString(position));

            for (int i = 0; i < list.size() ; i++) {
                Log.i("POST",Boolean.toString(list.get(i).isSelected()));
            }
        }
    });


    }

我的活动课:

public class RestaurauntMenuItemDetailActivity extends AppCompatActivity implements RestaurauntMenuItemDetailInterfaceHandler{

    private static List<RestaurauntMenuItemDetail> restaurauntMenuItemDetailList = new LinkedList<>();
    RestaurauntMenuItemDetailFetchAPI restaurauntMenuItemDetailFetchAPI;
    String restaurauntSlug;
    String  menuSlug;
    int  menuId;

    int variationCount;
    List<String> variationNamesList;


    private RecyclerView sectionHeader;
    private SectionedRecyclerViewAdapter sectionAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_restauraunt_menu_item_detail);
//
//        sectionAdapter = new SectionedRecyclerViewAdapter();





        restaurauntMenuItemDetailFetchAPI = new RestaurauntMenuItemDetailFetchAPI(this,this);
        restaurauntSlug =  getIntent().getExtras().getString("restaurauntSlug");
        menuSlug  = getIntent().getExtras().getString("menuSlug");
        menuId  = getIntent().getExtras().getInt("menuId");
        restaurauntMenuItemDetailFetchAPI.prepareURL(restaurauntSlug,menuSlug,menuId);
        restaurauntMenuItemDetailFetchAPI.fetchMenuItemDetail();

    }




    @Override
    public void restaurauntMenuItemDetailListDownloadTaskCompleted(List<RestaurauntMenuItemDetail> result,int variationCount,List<String> variationNames) {
        restaurauntMenuItemDetailList = result;
        this.variationCount = variationCount;
        variationNamesList = variationNames;
        sectionHeader = (RecyclerView)findViewById(R.id.menuItemDetailRecyclerView);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(RestaurauntMenuItemDetailActivity.this);
        sectionHeader.setLayoutManager(linearLayoutManager);
        sectionHeader.setHasFixedSize(true);


//      HeaderRecyclerViewSection secondSection = new HeaderRecyclerViewSection("Second Section", restaurauntMenuItemDetailList);
//      HeaderRecyclerViewSection thirdSection = new HeaderRecyclerViewSection("Third Section", restaurauntMenuItemDetailList);
        sectionAdapter = new SectionedRecyclerViewAdapter();
        for(int i=0; i < variationNamesList.size(); i++){

            String variationName = variationNames.get(i);
            addSectionToAdapter(variationName,sectionAdapter);
            sectionHeader.setAdapter(sectionAdapter);
        }

//        sectionAdapter.addSection(secondSection);
//        sectionAdapter.addSection(thirdSection);


//        initRecyclerView();



    }


    private void addSectionToAdapter(String variationName, SectionedRecyclerViewAdapter sectionAdapter){
        List<RestaurauntMenuItemDetail> l1 = new ArrayList<>();

        for (int i = 0; i < restaurauntMenuItemDetailList.size() ; i++) {
            if(restaurauntMenuItemDetailList.get(i).getVariationCategory().equals(variationName)){
                    l1.add(restaurauntMenuItemDetailList.get(i));
            }
        }

        HeaderRecyclerViewSection firstSection = new HeaderRecyclerViewSection(variationName, l1,sectionAdapter);
        sectionAdapter.addSection(firstSection);


    }
}

【问题讨论】:

  • 嗯,是radio button 的经典领域“单选按钮允许用户从一组选项中选择一个选项。”。你可以让复选框做到这一点,请不要(混乱会占上风)。
  • @JonGoodwin 我已经更新了这个问题。看一下屏幕截图。您可以使用单选按钮想象相同的代码。我在复选框之前尝试过。我有一个带有单选按钮或复选框、项目名称和价格的单行。我可以默认选择所有我不想要的。
  • 只需检查此答案,它可能会对您有所帮助。 stackoverflow.com/a/32428115/3669559

标签: android checkbox android-recyclerview sections


【解决方案1】:

试试这个。它对我有用。也可能对你有用。只需将您的 OnCheckedChangeListener 代码替换为以下代码:

iHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
    @Override
    public void onCheckedChanged(CompoundButton compoundButton,boolean b){
        if(compoundButton.isPressed()){
            // click is performed
            for(RestaurauntMenuItemDetail item:list){
            item.setSelected(false);
            }
            list.get(holder.getAdapterPosition()).setSelected(b);
            notifyDataSetChanged();
        }
    }
});

【讨论】:

  • 为什么不能调用 notifyDataSetChanged() 方法?它不能解决任何问题?
  • 好吧notifyDataSetChanged() 刷新recyclerview 导致每个视图重新绑定。如果您使用dataBinding,则可以避免这种情况
  • 您提供的代码对我不起作用。你能看看更新的代码。我还提供了我的活动代码。我正在动态创建部分,这也是正确的还是我做错了什么
【解决方案2】:

我查看了用户发布的许多其他问题,并从此处提供的 cmets 获得了一些帮助。我真正想要的是能够一次选中一个单选框,其次,当我们在回收站视图中向下滚动时,单选按钮中的复选框消失或错误。

我们需要在我们的类中保留一个布尔变量来保存我们的对象,我们可以默认将其设置为 false。生成 getter 和 setter。代码如下:

列表在顶部,以防万一。

 List<RadioButton> radioButtonList = new ArrayList<>();
    private int selectedPosition = -1;


   @Override
    public void onBindItemViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        final ItemViewHolder iHolder = (ItemViewHolder)holder;
        final RestaurauntMenuItemDetail r = list.get(position);



        iHolder.radioButton.setTag(position);

        iHolder.radioButton.setOnCheckedChangeListener(null);
        iHolder.radioButton.setChecked(r.getSelected());


        iHolder.radioButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Integer pos = (Integer) iHolder.radioButton.getTag();


                RadioButton rb = (RadioButton) v;



                if(radioButtonList.isEmpty()){
                    radioButtonList.add(rb);
                    rb.setChecked(true);
                    list.get(pos).setSelected(true);
                    selectedPosition = pos;
                }else{
                    RadioButton nrb = radioButtonList.get(0);
                    if(nrb.isChecked()){
                        Log.i("NEW RB BUTTON WAS CHECKED", "CHECKED NRB");
                        nrb.setChecked(false);
                        list.get(selectedPosition).setSelected(false);
                    }
                    radioButtonList.remove(0);
                    radioButtonList.add(rb);
                    rb.setChecked(true);
                    list.get(pos).setSelected(true);
                    selectedPosition = pos;

                }
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多