如何在ListView中设置捕获的图像?

时间:2017-08-29 05:35:05

标签: android listview

我有一个绑定到listview的ArrayList,自定义行有一个textview和一个imageview,现在当我点击任何一行时我给出了两个功能 1. Toast消息显示位置:正确显示。 2.打开相机以捕获图像并将该特定图像设置为单击的行。

现在我遇到的问题是:

图像被设置但总是到最后一行,而不是到它被点击的行,当我点击最后一行来捕捉图像时,设置图像时显示IndexOutofBoundException

我试过的代码:

public class DocumentsKYCAdapter extends BaseAdapter{

    private Context mContext;
    private ArrayList<DocumentItem> gridName;
    ArrayList<Integer> selectedDocumentId = new ArrayList<Integer>();
    ArrayList<String> selectedDocumentNames = new ArrayList<String>();
    ArrayList<Bitmap> selectedImages = new ArrayList<Bitmap>();
    private Bitmap[] gridImage;
    Documents_KYC activity;
    public static final int MEDIA_TYPE_IMAGE = 1;
    private static final String IMAGE_DIRECTORY_NAME = "Imageview";
    private Uri fileUri;
    ImageView imageView;
    public static byte[] b;
    public static String encodedImageStr1;
    int imageCapturedPosition;

    public DocumentsKYCAdapter(Documents_KYC activity, 
    ArrayList<DocumentItem> gridName,ArrayList<Integer> 
    selectedDocumentId,ArrayList<String> selectedDocumentNames) {

        this.activity = activity;
        this.gridImage = gridImage;
        this.gridName = gridName;
        this.selectedDocumentNames = selectedDocumentNames;
        this.selectedDocumentId = selectedDocumentId;
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup 
    parent) {

        View grid;


        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            grid = inflater.inflate(R.layout.documents_kyc_row, null);

        } else {
            grid = (View) convertView;
        }

        final String documentItemName = 
        selectedDocumentNames.get(position);
        final int documentItemId = selectedDocumentId.get(position);
        TextView textView = (TextView) grid.findViewById(R.id.gridName);
        imageView = (ImageView) grid.findViewById(R.id.gridImage);
        imageView.setTag(position);
        textView.setText(documentItemName);

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                imageCapturedPosition = position;
                Toast.makeText(activity,"Id"+documentItemId+"
               ,Position"+imageCapturedPosition,Toast.LENGTH_LONG).
                show();
                imageView.getTag(position);
                captureImage();
            }
        });


        return grid;
    }

    private void captureImage() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        activity.startActivityForResult(intent, MEDIA_TYPE_IMAGE);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent 
    data) {

        try {
            if (requestCode == MEDIA_TYPE_IMAGE && resultCode == 
                activity.RESULT_OK) {

                BitmapFactory.Options options = new 
                BitmapFactory.Options();
                options.inSampleSize = 1;
                Bitmap bitmap = Utility.decodeFile(fileUri.getPath(), 
                options);
                FileOutputStream out = null;
                try {
                    out = new FileOutputStream(fileUri.getPath());
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
                    ByteArrayOutputStream baos = new 
                    ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, 
                    baos);
                    b = baos.toByteArray();
                    encodedImageStr1 = Base64.encodeToString(b, 
                    Base64.DEFAULT);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                selectedImages.add(bitmap);          
                imageView.setImageBitmap(selectedImages.
                get(imageCapturedPosition));


            } else if (resultCode == activity.RESULT_CANCELED) {
                Toast.makeText(activity,
                        "User cancelled image capture", 
                        Toast.LENGTH_SHORT)
                        .show();
            } else {
                Toast.makeText(activity,
                        "Sorry! Failed to capture image", 
                         Toast.LENGTH_SHORT)
                        .show();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }   

}

自定义类:

public class BitmapModel {

Bitmap imageId;
ArrayList<String> documentNamesList;

public ArrayList<String> getDocumentNamesList() {
    return documentNamesList;
}

public void setDocumentNamesList(ArrayList<String> documentNamesList) {
    this.documentNamesList = documentNamesList;
}

public Bitmap getImageId() {
    return imageId;
}

public void setImageId(Bitmap imageId) {
    this.imageId = imageId;
}

}

1 个答案:

答案 0 :(得分:1)

您的问题在于 -

selectedImages.add(bitmap);

每当你向arrayList添加一个图像时,它总是在最后一个位置添加,然后当你执行imageView.setImageBitmap(selectedImages.get(imageCapturedPosition));它会尝试获取你选择的位置的值,这不一定是最后一个位置。

更好的方法是创建一个自定义类,BitmapselectedDocumentNames作为类的一部分,然后该类的每个对象都代表一个名称和与之关联的图像。

现在,当您捕获图像时,将图像分配给类Bitmap,然后使用该位图填充列表视图。

您当前代码的解决方法是将图像添加到由imageCapturedPosition表示的数组中的特定位置,或者创建hashmap类型position,bitmap,然后将其存储为选定的位置。虽然我不会推荐任何这些变通办法,因为它们将来会引起其他问题,例如内存泄漏和数组中的位置移动等,你将不得不照顾这些事情