2017-08-29 4 views
1

Ich habe eine ArrayList, die an die ListView gebunden ist, die benutzerdefinierte Zeile hat eine Textansicht und eine Bildansicht, jetzt, wenn ich auf eine Zeile klicken, habe ich zwei Funktionen 1. Toast-Meldung zur Anzeige der Position: die ordnungsgemäß angezeigt wird. 2. Öffnen Sie die Kamera, um ein Bild aufzunehmen, und legen Sie dieses bestimmte Bild in der Zeile fest, auf die geklickt wurde.Wie wird das aufgenommene Bild in ListView festgelegt?

Nun ist das Problem, das ich bin vor ist:

Das Bild wird eingestellt, aber immer auf die letzte Zeile und nicht auf die Reihe, wo es angeklickt wurde, und als ich in der letzten Zeile auf dem Bild klicken, um zu erfassen, während der Einstellung Bild, um es sagt IndexOutofBoundException

Der Code, den ich versucht habe:

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(); 
     } 
    } 

} 

Kundenspezifische Klasse:

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; 
} 

}

Antwort

1

Ihr Problem ist in der Linie -

selectedImages.add(bitmap); 

Hier, wenn Sie ein Bild zu Ihrer Arraylist hinzufügen, fügt er immer an der letzten Position und dann, wenn Sie tun imageView.setImageBitmap(selectedImages.get(imageCapturedPosition)); Es wird versucht, den Wert zu erhalten für die Position, die Sie ausgewählt haben, die nicht unbedingt die letzte Position ist.

Der bessere Weg für Sie ist das Erstellen einer benutzerdefinierten Klasse mit Bitmap und selectedDocumentNames als Teil der Klasse, dann jedes Objekt der Klasse würde einen Namen und ein Bild, das damit verbunden ist.

Jetzt, wenn Sie das Bild erfassen, weisen Sie das Bild der Klasse Bitmap zu und füllen Sie dann Ihre ListView mit dieser Bitmap.

Die Abhilfe für den vorliegenden Code Code entweder das Bild in eine bestimmte Position in der Anordnung von imageCapturedPosition oder erstellen hashmap vom Typ position,bitmap und dann speichert mit der ausgewählten Position bezeichnet hinzuzufügen. obwohl ich keine dieser Problemumgehungen empfehlen würde, da sie andere Probleme in der Zukunft wie Speicherlecks und Positionsbewegungen in Arrays usw. verursachen würden und Sie würden sich um diese Dinge kümmern müssen

+0

Danke für die Antwort, ich habe eine benutzerdefinierte Klasse erstellt wie ich es in meiner Frage aktualisiert habe, aber können Sie mir sagen, ob ich eine Liste von Bitmaps oder nur ein Bitmap-Objekt erstellen muss? –

+0

Es hängt von Ihrer Anforderung ab. Wenn Sie nur 1 Bild pro Zeile haben möchten, genügt innerhalb der Modellklasse nur ein einzelnes Objekt. dann müssen Sie eine Liste von Modellklassen-Objekten haben, um Daten zu speichern und Listenansicht zu füllen –

+0

Hey Kapil danke für die Vorschläge, es hat funktioniert –

Verwandte Themen