使用setOnCheckedChangeListener的复选框持有者

时间:2016-07-04 17:25:12

标签: java android android-layout listview android-checkbox

我正在尝试使用复选框创建列表视图,我已经尝试过代码并且它正常工作但我在尝试处理复选框状态时遇到了问题。问题出现在这行代码中

holder.chkBox.setOnCheckedChangeListener((MyActivity) context);

因为我试过的代码是使用与MainActivity.java文件分开的Adapter.java文件,但在我的代码中所有都在一个文件中,所以我不知道如何在我的代码中使用这一行,我试过了此

holder.chkBox.setOnCheckedChangeListener((this) context);

但也是错误的陈述

使用此系列持有人的原因是当我选中一个复选框并向下滚动其他项目时,系统会自动取消选中已选中的复选框,有人可以告诉我如何解决此问题吗?

这是我的适配器代码

@Override public View getView(final int position, View convertView, ViewGroup parent) {
         ViewHolder holder=null;
        View itemView = convertView;
        if (itemView == null){
            LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            itemView = inflater.inflate(R.layout.item, null);
            holder = new ViewHolder();
            holder.textView1  = (TextView) itemView.findViewById(R.id.textView1);
            holder.check1 = (CheckBox) itemView.findViewById(R.id.check1);
            holder.check2 = (CheckBox) itemView.findViewById(R.id.check2);
            itemView.setTag(holder);
       }
        else{
            holder = (ViewHolder) itemView.getTag();
        }
        holder.check1.setTag(position);
        final Item item = items.get(position);
        holder.textView1.setText(item.getName());
        holder.check1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                                                     @Override
                                                     public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                                                         if(buttonView.isPressed()){

                                                         if (position != ListView.INVALID_POSITION) {
                                                             Item p = items.get(position);
                                                             p.setSelected(isChecked);
                                                         }

                                                         }
                                                     }
                                                 }
        );
holder.check2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                                                     @Override
                                                     public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                                                         if(buttonView.isPressed()){
                                                                               if (position != ListView.INVALID_POSITION) {
                                                                 Item p = items.get(position);
                                                                 p.setSelected(isChecked);
                                                             }

                                                         }
                                                     }
                                                 }
        );
        holder.check1.setChecked(item.isSelected());
        holder.check2.setChecked(item.isSelected());
        return itemView;
    }
}private static class ViewHolder {
    public TextView textView1;
   public CheckBox  check2,check1;
}}

2 个答案:

答案 0 :(得分:0)

在您使用的示例代码中,您的活动实现了OnCheckedChangeListener,因此您需要传递上下文。在您的适配器中,您可以按如下方式执行此操作:

holder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

       @Override
       public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
           // logic
       }
   }
);  

在您使用它的代码中,您可能在活动中重写了onCheckedChanged方法。移动我逻辑上面的逻辑//逻辑。

答案 1 :(得分:0)

首先,让您的活动实现OnCheckedChangedListener接口,强制实现以下方法:

        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

        }

现在将您的活动引用作为OnCheckedChangeListener类型的参数传递给您的适配器,并将其命名为listener:

MyAdapter myadapter = new MyAdapter(context, MyActivity.this,listdata);

然后,在您的适配器类中,为您的复选框设置监听器,如:

holder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

   @Override
   public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {


            if(buttonView.isPressed()){
            //Write the logic to determine if the checkbox must be checked or not                
                }
          }
      }
    ); 

此处的重点是,使用复选框的 isPressed()方法。