2017-08-29 33 views
1

我有這勢必列表視圖一個ArrayList,自定義行具有一個TextView和ImageView的,現在當我點擊任何行我已經給出了兩個功能 1.吐司消息顯示的位置是:其被正確顯示。 2.打開相機捕捉的圖像和特定圖像設定爲被點擊的行。如何在ListView中設置捕獲的圖像?

現在,這是我現在面臨的問題是:

圖像獲取設置,但總是到最後一行,而不是它被點擊的行,當我點擊最後一行,同時設置拍攝圖像像它說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

你的問題是該行 - 只要你的圖像添加到您的ArrayList它總是在最後位置增加,然後當你做imageView.setImageBitmap(selectedImages.get(imageCapturedPosition));它試圖獲得價值

selectedImages.add(bitmap); 

這裏你選擇的位置不一定是最後一個位置。

爲您做的更好的方法是創建一個自定義類與BitmapselectedDocumentNames作爲類的一部分,那麼類的每個對象將是一個名稱和與之相關聯的圖像。現在

當你捕捉到圖像時,圖像定義的類位圖,然後填充與位圖的列表視圖。

爲您的本碼的碼的解決方法是要麼添加圖像劃分成在陣列中的特定位置由imageCapturedPosition表示或創建position,bitmap類型的hashmap然後存儲它與所選擇的位置。雖然我不會推薦任何這些替代方法,因爲它們會導致在未來像內存泄漏陣列等其他問題和位置運動,你將不得不採取的這些東西

+0

感謝您的回覆照顧,我創建了一個自定義類正如我已經在我的問題更新它,但你能告訴我,我是否需要創建位圖的列表,或只是一個位圖對象? –

+0

這取決於您的要求。如果你想每行只有一個圖像,那麼在模型類中只有單個對象是足夠的。那麼你需要有模型類對象的列表來保存數據和填充的ListView –

+0

嘿卡皮爾感謝您的建議,它的工作 –

相關問題