2017-08-29 10 views
1

私はリストビューにバインドされたArrayListを持っています。カスタム行にはtextviewとimageviewがあります。これは2つの機能を与えた行をクリックすると表示されます 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

あなたの問題はラインである -

selectedImages.add(bitmap); 

ここでは、あなたのArrayListに画像を追加するたびに、それは常に最後の位置に追加され、あなたがimageView.setImageBitmap(selectedImages.get(imageCapturedPosition));を行うとき、それは値を取得しようとします必ずしも最後の位置ではない、あなたが選択した位置について。

BitmapselectedDocumentNamesでクラスの一部としてカスタムクラスを作成すると、クラスの各オブジェクトは名前とそれに関連付けられたイメージを表します。

イメージをキャプチャするとき、イメージをクラスBitmapに割り当て、次にリストビューにそのビットマップを設定します。

あなたの現在のコードのコードを回避する選択された位置とimageCapturedPositionによって示さアレイ内の特定の位置に画像を追加したり、タイプposition,bitmaphashmapを作成し、それを格納するためのいずれかです。私はこれらの回避策のいずれかを推奨しませんでした。将来、配列のメモリリークや位置の動きなど、他の問題を引き起こす可能性があります。これらのことを気にする必要があります。

+0

ありがとう、私はカスタムクラス私は私の質問でそれを更新しましたが、私はビットマップまたはビットマップオブジェクトのリストを作成する必要があるかどうか教えていただけますか? –

+0

あなたの要求によって異なります。 1行につき1つのイメージしか持たない場合は、モデルクラス内で単一のオブジェクトで十分です。あなたはモデルクラスのオブジェクトのリストを持っている必要がありますデータを保存し、リストビューを設定する –

+0

ちょっとカピルの提案のおかげで、それは働いた –

関連する問題