单击列表视图项时每次第一次加载摄像机都会取消选中列表视图中的所有复选框

时间:2015-11-19 06:20:08

标签: android listview checkbox

这是我的自定义列表适配器类,其中我填充了包含一个复选框和imageview的列表项。选中该复选框后,图像视图将显示在列表视图的同一行上,单击该图像视图即可加载相机。但是,每次第一次加载相机并拍摄照片或按下而不捕捉图像时,复选框中的所有检查都会消失,但在第一次完成后,一切正常。任何人都可以告诉我为什么会这样吗

public class CustomListAdapter extends ArrayAdapter<String> {

private final Activity context;
private final String[] itemname;

private static final int CAMERA_REQUEST = 1888;


public CustomListAdapter(Activity context, String[] itemname) {
    super(context, R.layout.merch_items, itemname);
    // TODO Auto-generated constructor stub
    this.context=context;
    this.itemname=itemname;



}

public View getView(final int position,View view, ViewGroup parent){
    LayoutInflater inflater = context.getLayoutInflater();
    View rowView = inflater.inflate(R.layout.merch_items,null,true);

    final ImageView imageView = (ImageView) rowView.findViewById(R.id.merchimageView);
    final TextView merchText = (TextView) rowView.findViewById(R.id.merchimagetext);
    final CheckBox checkBox = (CheckBox) rowView.findViewById(R.id.checkBox);


    imageView.setTag("empty");
    checkBox.setText(itemname[position]);


    checkBox.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(checkBox.isChecked()){
                imageView.setImageResource(R.drawable.camera);
                imageView.setTag("available");
            }
            else{
                imageView.setImageDrawable(null);
                imageView.setTag("empty");
            }

        }

    });

    imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(imageView.getTag().toString().equals("available")) {

                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                ((Activity)context).startActivityForResult(cameraIntent, CAMERA_REQUEST);

            }

        }
    });




    return rowView;

}
}

1 个答案:

答案 0 :(得分:0)

在适配器的数据更改通知中,重新创建列表。在这种情况下,即使你第二次完美的工作也不会成立。

编写getView方法的方式并不完全正确。因为列表项没有回收过程,所以它们一直在创建。

处理此问题的一种方法是保留一个布尔列表,其中索引表示位置,布尔值表示检查框是否天气,使用该值可以设置要检查的复选框!