【问题标题】:Spinner conflicts with Checkbox inside a ListView - Why?Spinner 与 ListView 中的 Checkbox 冲突 - 为什么?
【发布时间】:2014-05-21 12:50:00
【问题描述】:

我试图找出为什么微调器与列表视图中的复选框冲突。如果我评论微调线,checkBox 监听器工作正常,我可以选择它,检查是否被选中并删除列表的行。如果我让微调器声明,就像在下面的代码中一样,监听器工作,我可以选择复选框,但是当我尝试获取所选项目(在 checkToDelete 方法)时,所选项目的返回checkBox 始终为空(就像没有选择任何内容一样)。我需要微调器来检查项目的数量和复选框来删除行。

无论如何,我已经研究了 2 天的解决方案,并且在知道发生了什么并防止将来出现错误之前不想让这个问题消失。我发现的一种可能的解决方案是避免使用微调器,而是使用use a button with AlertDialog

有人知道我在这里缺少什么吗?

 @Override
        public View getView(final int position,View convertView, ViewGroup viewGroup) {
            LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            final View rowView = inflater.inflate(R.layout.menu_itens, viewGroup
                    , false);

            String itemName = MENU_ITEM.get(position);
            TextView item = (TextView) rowView.findViewById(R.id.item);     
                item.setText(itemName);
            imageView = (ImageView) rowView.findViewById(R.id.itemImage);

            checkBox[position] = (CheckBox) rowView.findViewById(R.id.check);
            checkBox[position].setTag(itemName);
            checkBox[position].setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {               
                        checkBox[position].setSelected(buttonView.isChecked());
                    }            
                });         
                spinner[position] = (Spinner) rowView.findViewById(R.id.quantity);
                spinner[position].setAdapter(spinnerAdapterArray[position]);
                spinner[position].setOnItemSelectedListener(new OnItemSelectedListener() {

                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view,
                            int pos, long id) {
                        //Listener options      
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {
                        // TODO Auto-generated method stub              
                    }           
                });
                return rowView;
            }

      public List<Integer> checkListToDelete() {

        List<Integer> aux = new ArrayList<Integer>();   
        for(int i=0; i<MENU_SIZE; i++){
            System.out.println(checkBox[i].isChecked());
            if(checkBox[i].isChecked()){
                checkBox[i].setChecked(false);
                aux.add(i);
                }
            }   
        return aux; 
        }

【问题讨论】:

  • 这不是您创建适配器的方式,您不能只使用视图数组并通过position 对其进行索引。
  • 你能指导我吗?我的意思是,为什么错了?到目前为止,我的工作很完美,因为我需要为每个人提供不同的听众
  • 我昨天看到了这个例子,但我不确定是否应该使用它。通过调试点,我意识到每个findViewByID 都会调用getView,这意味着如果我将所有内容集中在持有人中,也许它会起作用?

标签: android listview checkbox spinner getview


【解决方案1】:
    private List<Boolean> mCheckList;

    @Override
    public View getView(final int position,View convertView, ViewGroup viewGroup) {
        LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        final ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.menu_itens, null);

            holder.textview = (TextView) convertView.findViewById(R.id.item);     
            holder.imageView = (ImageView) convertView.findViewById(R.id.itemImage);
            holder.checkBox = (CheckBox) convertView.findViewById(R.id.check);
            holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                @Override 
                public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {               
                    mCheckList.set(position, isChecked);
                }            
            });

            holder.spinner = (Spinner) convertView.findViewById(R.id.quantity);
            holder.spinner.setAdapter(spinnerAdapterArray[position]);
            holder.spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> parent, View view,
                        int pos, long id) {
                    //Listener options      
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    // TODO Auto-generated method stub              
                }           
            });

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder)convertView.getTag();
        }

        String itemName = MENU_ITEM.get(position);
        holder.textview.setText(itemName);
        holder.checkbox.setChecked(mCheckList.get(position));

        return convertView;
    }

    public List<Integer> checkListToDelete() {

        List<Integer> aux = new ArrayList<Integer>();   
        for(int i=0; i<MENU_SIZE; i++){
            System.out.println(mCheckList.get(i));
            if(mCheckList.get(i)){
                aux.add(i);
            }

            mCheckList.set(i, false);
        }

        notifyDataSetChanged();
        return aux; 
    }

    class ViewHolder {
        TextView textview;
        ImageView imageview;
        Spinner spinner;
        CheckBox checkbox;
    }

【讨论】:

  • 我在这里将您的代码改编为我的整个代码,我唯一缺少的一点是测试您的解决方案 mCheckList.get(i) = falsemCheckList.get(i) = isChecked 它是说 mCheckList.get(i) 需要一个变量 - 试图解决这个问题来测试
  • 我尝试使用mCheckList.add(i, isChecked);无论如何,该应用程序在视觉上可以正常工作,直到现在还不错,但是当我尝试选中该框时崩溃了。发生这种情况是因为mCheckList 为空,它没有被初始化。我正在尝试List&lt;Boolean&gt; mCheckList = new ArrayList&lt;Boolean&gt;();,即使仍然得到 NullPointerException
  • 您需要在适配器的构造函数中初始化列表。另外,你在哪里打电话checkListToDelete()?给我看所有的代码。
  • 到目前为止,我在想的是你不能设置没有添加的东西。我尝试使用mCheckList.add(isChecked); 仅静态删除第一个位置,它工作正常,我会看看我能从这里做些什么来动态处理它 - 我会接受你的回答,如果你能简单解释一下,我也会感激不尽持有人的用法,使用与否有什么不同。非常感谢!
  • 您需要将列表初始化为与项目列表相同的大小(MENU_SIZE?),然后您可以使用mCheckList.set。但是 ViewHolder 的目的是让您不要经常使用findViewById,这是非常密集的操作。它允许列表的平滑滚动。
猜你喜欢
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多