Android中的CheckBoxes

时间:2011-10-10 11:02:59

标签: android android-layout android-widget

嗨我在android中使用带有listview的复选框当我滚动listitem时,我没有得到相同的复选框已检查预期的内容请帮我弄清楚我错在哪里。当我选择第一个复选框并滚动它给我第二个复选框作为选中,其他输出也很奇怪。这是我的代码

class base extends BaseAdapter{

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return price.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            View v=arg1;
j=arg0;
            LayoutInflater li=getLayoutInflater();
            v=li.inflate(R.layout.listitem, null);
            TextView txt=(TextView)v.findViewById(R.id.tv_name);
            txt.setText(author.get(arg0));
            TextView txt1=(TextView)v.findViewById(R.id.tv_description);
            txt1.setText(price.get(arg0));
            TextView txt2=(TextView)v.findViewById(R.id.txtv);
        txt2.setText(title.get(arg0));
        ImageView img=(ImageView)v.findViewById(R.id.iv_forward);


        img.setImageBitmap(bit.get(arg0));
        CheckBox check1=(CheckBox)v.findViewById(R.id.check);
        if(check[j]!=null)
            if(check[j]==true)
            check1.setChecked(true);
            else check1.setChecked(false);

        check1.setOnCheckedChangeListener(new OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg2) {
                // TODO Auto-generated method stub
                if(arg2==true)
                //  Toast.makeText(SimpleActivity.this,arg0+"", Toast.LENGTH_LONG).show();
                check[j]= true;
                else 
                    check[j]=false;
            }

        });

            return v;


    }
        }

请帮忙。

3 个答案:

答案 0 :(得分:1)

由于您每次都在回收视图,因此该复选框的值与列视图的上一个视图的值相同。我要做的是每次迭代都将复选框设置为false FIRST,然后确定是否应该检查它:

check1.setChecked(false);
if(check[j]!=null && check[j]==true){
        check1.setChecked(true);
}

答案 1 :(得分:0)

我认为这可能是因为Adapter getView()方法正在调用onCheckedChanged()(仅当重用的Views具有相反的值时)。这会导致奇怪的行为。

public View getView(int arg0, View arg1, ViewGroup arg2) {
  if(check[j]==true) check1.setChecked(true); // will automatically call onCheckedChanged 
  else check1.setChecked(false);              // if check1 was previously the opposite

}

您应该在更改值之前取消checkListener:

public View getView(int arg0, View arg1, ViewGroup arg2) {

  check1.setOnCheckedChangeListener(null); // first remove listener

  //update values
  if(check[j]==true) check1.setChecked(true); //no more side effect
  else check1.setChecked(false);

  //reinstall listener
  check1.setOnCheckedChangeListener(new OnCheckedChangeListener(){
     //your code.
  }
}

答案 2 :(得分:0)

我遇到了与ListBox相似的问题。Here你可以找到这个问题的完整解决方案。