Java 在listview中选中复选框

Java 在listview中选中复选框,java,android,listview,Java,Android,Listview,我正在尝试在列表视图中获取选中的复选框。我一直在网上搜索,但我总是找到使用支架的例子,但我没有使用它。我也问了我的老师,但也不知道为什么这不起作用 public class MyActivity extends Activity { String s; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sav

我正在尝试在列表视图中获取选中的复选框。我一直在网上搜索,但我总是找到使用支架的例子,但我没有使用它。我也问了我的老师,但也不知道为什么这不起作用

    public class MyActivity extends Activity {

        String s;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my);

            ListView list=(ListView)findViewById(R.id.listView);
            Button checkBtn=(Button)findViewById(R.id.button);
            final ArrayList<SportItem> sportArray=new ArrayList<SportItem>();

            SportItem sp;

            sp=new SportItem(getResources().getDrawable(R.drawable.baloncesto),"Basketball",false);
            sportArray.add(sp);
            sp=new SportItem(getResources().getDrawable(R.drawable.futbol),"Football",false);
            sportArray.add(sp);
            sp=new SportItem(getResources().getDrawable(R.drawable.judo),"Judo",false);
            sportArray.add(sp);
            sp=new SportItem(getResources().getDrawable(R.drawable.atletismo),"Athletism",false);
            sportArray.add(sp);
            sp=new SportItem(getResources().getDrawable(R.drawable.tenis),"Tennis",false);
            sportArray.add(sp);

            SportAdapter spadapter=new SportAdapter(this, sportArray);

            list.setAdapter(spadapter);

            checkBtn.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    s="";
                    for (SportItem ar:sportArray){

                        if(ar.isCheck()){
                            s+=ar.getName()+", ";
                        }
                    }

                    Toast.makeText(getApplicationContext(), s,
                            Toast.LENGTH_SHORT).show();        
                }
            });
        }

    }

    public class SportAdapter extends BaseAdapter {

        protected Activity activity;
        protected ArrayList<SportItem> items;
        CheckBox chk;
        SportItem sp;

        public SportAdapter(Activity activity, ArrayList<SportItem> items) {
            this.activity = activity;
            this.items = items;
        }

        @Override
        public int getCount(){
            return items.size();
        }

        @Override
        public Object getItem(int i) {
            return items.get(i);
        }

        @Override
        public long getItemId(int i) {
            return items.get(i).getId();
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            View v=view;

            if(view==null){
                LayoutInflater linf=(LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v=linf.inflate(R.layout.item_lista,null);
            }

            sp=items.get(i);
            ImageView img=(ImageView)v.findViewById(R.id.imageView);
            img.setImageDrawable(sp.getImage());

            TextView name=(TextView)v.findViewById(R.id.textView);
            name.setText(sp.getName());

            chk=(CheckBox)v.findViewById(R.id.checkBox);
            chk.setChecked(sp.isCheck());

            chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    if(!chk.isChecked()) {
                        sp.setCheck(true);
                        chk.setChecked(sp.isCheck());
                    }
                    else {
                        sp.setCheck(false);
                        chk.setChecked(sp.isCheck());
                    }
                }
            });

            return v;
        }

    }


public class SportItem {

    protected Drawable image;
    protected String name;
    protected boolean check;
    protected long id;

    public SportItem(Drawable image, String name, boolean check) {
        super();
        this.image = image;
        this.name = name;
        this.check = check;
    }

    public SportItem(Drawable image, String name, boolean check, long id) {
        super();
        this.image = image;
        this.name = name;
        this.check = check;
        this.id = id;
    }

    public Drawable getImage() {
        return image;
    }

    public void setImage(Drawable image) {
        this.image = image;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isCheck() {
        return check;
    }

    public void setCheck(boolean check) {
        this.check = check;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}

我找到了解决办法,改变了这个

sp=items.get(i);

为此

sp=getItem(i);

编辑: 我也必须在getView中添加这个


最终int pos=i

解决方案比您提到的更简单。您不需要同时侦听单击和检查更改。使用getItem或items.geti并不重要,它们做的是相同的事情

每次关联的复选框更改检查状态时,您只需更新SportItem的检查状态

您的OnCheckedChangeListener已侦听检查状态中的更改

将OnCheckedChangeListener修改为:

chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                sp.setCheck(b); //Updates the state with what is currently shown on screen.
            }
        });

使用稀疏布尔数组。检查链接,可能你会得到一些解决方法。首先,我忘了说我也必须在getView上添加这一行:final int pos=I;如果onCheckedChanged函数内容更改为:SportItem spI=getItempos;spI.setCheckb@Doruko,你有没有试着回到原来的答案,像我提到的那样修改选中的更改侦听器?你甚至不需要一个点击听众。是的,我已经试着按照你说的做了。。。但是没有正常工作
chk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                CheckBox cb=(CheckBox) view;
                SportItem spI=getItem(pos);
                spI.setCheck(cb.isChecked());
            }
        });
chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                sp.setCheck(b); //Updates the state with what is currently shown on screen.
            }
        });