2016-05-07 12 views
6

Ich möchte das aufgenommene Bild in dynamisch erstellter Bildansicht im selben Rasterlayout erstellen, aber es erstellt ein neues Rasterlayout und setzt das aufgenommene Bild auf die neue Rasteransicht.dynamically created imageview in gridlayout funktioniert nicht

Das ist mein mainactivity.java Datei

public class MainActivity extends Activity implements AdapterView.OnItemClickListener { 

    GridView gridView; 
    ArrayList<Damage_Item> gridArray = new ArrayList<Damage_Item>(); 
    CustomAdapter_back customGridAdapter; 
    GridLayout mContainerView; 
    int REQUEST_CAMERA = 0, SELECT_FILE = 1; 
    ImageView dynamic_imageview; 
    LinearLayout dynamic_linearview; 
    String image1; 
    ArrayList<String> arrayList_image = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mContainerView = (GridLayout)findViewById(R.id.describedamage_gridview) ; 
     //gridArray.add(new Item(homeIcon,"Home")); 
     gridView = (GridView) findViewById(R.id.gridview1); 

     Button add = (Button)findViewById(R.id.button1); 
     add.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       inflateImageRow(); 
      } 
     }); 

    } 

    public void selectImage() { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(intent, REQUEST_CAMERA); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == Activity.RESULT_OK) { 
      if (requestCode == REQUEST_CAMERA) 
      onCaptureImageResult(data); 
     } 
    } 

    public void onCaptureImageResult(Intent data) { 
     Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
     Bitmap resized = Bitmap.createScaledBitmap(thumbnail, 140, 150, true); 
     Bitmap dest = Bitmap.createBitmap(resized.getWidth(), resized.getHeight(), Bitmap.Config.ARGB_8888); 

     ByteArrayOutputStream byteArrayOutputStream1 = new ByteArrayOutputStream(); 
     dest.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream1); 

     SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
     String dateTime = sdf.format(Calendar.getInstance().getTime()); // reading local time in the system 


     Canvas canvas = new Canvas(dest); //bmp is the bitmap to dwaw into 
     Paint paint = new Paint(); 
     canvas.drawBitmap(resized, 0f, 0f, null); 
     paint.setColor(Color.BLACK); 
     canvas.drawRect(1, 145, 100, 130, paint); 
     paint.setColor(getResources().getColor(R.color.orange)); 
     paint.setTextSize(10); 
     paint.setFakeBoldText(true); 

     paint.setTextAlign(Paint.Align.LEFT); 
     float height = paint.measureText("yY"); 
     canvas.drawText(dateTime, 5f, height+130f, paint); 

     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     dest.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); 
     byte[] byteArray = byteArrayOutputStream.toByteArray(); 
     String image1 = Base64.encodeToString(byteArray, Base64.DEFAULT); 

     //arrayList_image.add(image1); 
     BitmapDrawable background = new BitmapDrawable(dest); 
     //holder.imageItem.setBackground(background); 
     Damage_Item damage_item = new Damage_Item(); 
     damage_item.setTemp_image(dest); 
     gridArray.add(damage_item); 

     customGridAdapter = new CustomAdapter_back(MainActivity.this, gridArray); 
     gridView.setAdapter(customGridAdapter); 


     /*gridView.setAdapter(customGridAdapter); 

     gridView.setOnItemClickListener(MainActivity.this)*/; 



    } 
    int count; 
    private void inflateImageRow() { 

     LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final View rowView = inflater.inflate(R.layout.dynamic_row, null); 
     dynamic_imageview = (ImageButton)rowView.findViewById(R.id.dynamic_imageview); 

     dynamic_linearview=(LinearLayout)rowView.findViewById(R.id.dynamic_linear); 

      dynamic_imageview.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //image_flagdynamic_right = true; 
       selectImage(); 
      } 
     }); 
     count= mContainerView.getChildCount()-1; 
     dynamic_imageview.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(final View v) { 
      int parent=((View) v.getParent()).getId(); 
      AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
       builder.setTitle("Whould you like to delete this image?"); 
       builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         int index = ((View) v.getParent()).getId() + 2; 

         try { 
          mContainerView.removeView((View) v.getParent()); 
          // arrayList_image.remove(((View) v.getParent()).getId()); 
         } catch (IndexOutOfBoundsException e) { 
          e.printStackTrace(); 
         } 
         Toast.makeText(getApplicationContext(), "delete", Toast.LENGTH_LONG).show(); 
        } 
       }); 
       builder.setNegativeButton("No", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           dialog.cancel(); 
          } 
         }); 
       AlertDialog alert = builder.create(); 
       alert.show(); 

       return false; 
      } 
     }); 

     mContainerView.addView(rowView, mContainerView.getChildCount() - 1); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

    } 
} 

dies meine Adapter-Datei ist CustomAdapter_back.java

public class CustomAdapter_back extends BaseAdapter { 

    private Context context; 
    private ArrayList<Damage_Item> Damage_Item; 
    LayoutInflater inflater; 
    ImageView button; 

    public CustomAdapter_back(Context context, ArrayList<Damage_Item> Damage_Item) { 
     this.context = context; 
     this.Damage_Item = Damage_Item; 
     inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return Damage_Item.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.row_grid, null); 
      button = (ImageView) convertView.findViewById(R.id.imageview); 
     } 
     else 
     { 
     } 

     button.setImageBitmap(Damage_Item.get(position).getTemp_image()); 

     return convertView; 
    } 
} 

Meine activity_manin.xml Datei

<Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="26dp" 
     android:padding="11dp" 
     android:text="Add" /> 
<GridLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/describedamage_gridview" 
    android:columnCount="2" 
    android:layout_below="@+id/button1" 
    android:rowCount="1" 
    android:orientation="horizontal"> 

    <GridView 
     android:id="@+id/gridview1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:columnWidth="90dp" 
     android:numColumns="2" 
     android:verticalSpacing="10dp" 
     android:horizontalSpacing="10dp" 
     android:stretchMode="columnWidth" 
     android:gravity="center" 
     /> 
</GridLayout> 

row_grid.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="5dp" > 

    <ImageView 
     android:id="@+id/imageview" 
     android:layout_width="170dp" 
     android:layout_height="150dp" 
     android:background="@drawable/camera" /> 

    </LinearLayout> 
+0

Ich verstehe nicht klar, was ist der Punkt, ein GridView in einem GridLayout zu verwenden ... Sie könnten nur ein GridView mit 2 Spalten verwenden und hinzufügen das ImageView dynamisch. Wie ich sehe, scheint Ihr Problem den Adapter jedes Mal neu zu erstellen, wenn Sie 'onCaptureImageResult()' übergeben. Sie sollten es einmal erstellen und aktualisieren, indem Sie 'notifyDataSetChanged()' aufrufen. – Fllo

Antwort

0

Zuerst scheint es, dass Sie kein Halter-Muster in Ihrem CustomAdapter_back verwenden, da auch Flo bemerkte, dass Sie die Ansichten nicht manuell entfernen müssen. merken Um diese Funktion zu Ihrem Adapter

public void setData(ArrayList<Damage_Item> data) 
{ 
    this.Damage_Item = Damage_Item; 
    notifyDataSetChanged(); 
} 

und rufen Sie diese Funktion aus dem Dialog

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
      builder.setTitle("Whould you like to delete this image?"); 
      builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        //get deleted item index according to your logic 
        int index = ((View) v.getParent()).getId() + 2; 
        gridArray.remove(index); 
        customGridAdapter.setData(gridArray); 
        Toast.makeText(getApplicationContext(), "delete", Toast.LENGTH_LONG).show(); 
       } 
      }); 
0

in auf activityResult Ihnen ein 2-Zeilen Code haben:

customGridAdapter = new CustomAdapter_back(MainActivity.this, gridArray); 
    gridView.setAdapter(customGridAdapter); 

so jedes einzelne Mal, Wenn Sie ein neues Bild hinzufügen, erstellen Sie den Adapter neu.

Verschieben Sie die Adapterdeklaration einfach auf onCreate mit leerer Liste. Add-Methode

public void addItem(Damage_Item item){ 
    this.Damage_Item.add(item); 
    this.notifyDataSetChange(); 
} 

zu Ihrem Adapter und löst es statt Adapter zu schaffen und neue in Ihrem onCaptureImageResult Einstellung.

Und für Gott willen, Namenskonvention. Der Code ist nicht lesbar

0

Versuchen Sie, diese

public class MainActivity extends Activity implements AdapterView.OnItemClickListener { 

GridView gridView; 
ArrayList<Damage_Item> gridArray = new ArrayList<Damage_Item>(); 
CustomAdapter_back customGridAdapter; 
GridLayout mContainerView; 
int REQUEST_CAMERA = 0, SELECT_FILE = 1; 
ImageView dynamic_imageview; 
LinearLayout dynamic_linearview; 
String image1; 
ArrayList<String> arrayList_image = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mContainerView = (GridLayout)findViewById(R.id.describedamage_gridview) ; 
    //gridArray.add(new Item(homeIcon,"Home")); 
    gridView = (GridView) findViewById(R.id.gridview1); 

    Button add = (Button)findViewById(R.id.button1); 
    add.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      inflateImageRow(); 
     } 
    }); 
customGridAdapter = new CustomAdapter_back(MainActivity.this, gridArray); 
    gridView.setAdapter(customGridAdapter); 

} 

public void selectImage() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, REQUEST_CAMERA); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == Activity.RESULT_OK) { 
     if (requestCode == REQUEST_CAMERA) 
     onCaptureImageResult(data); 
    } 
} 

public void onCaptureImageResult(Intent data) { 
    Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
    Bitmap resized = Bitmap.createScaledBitmap(thumbnail, 140, 150, true); 
    Bitmap dest = Bitmap.createBitmap(resized.getWidth(), resized.getHeight(), Bitmap.Config.ARGB_8888); 

    ByteArrayOutputStream byteArrayOutputStream1 = new ByteArrayOutputStream(); 
    dest.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream1); 

    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
    String dateTime = sdf.format(Calendar.getInstance().getTime()); // reading local time in the system 


    Canvas canvas = new Canvas(dest); //bmp is the bitmap to dwaw into 
    Paint paint = new Paint(); 
    canvas.drawBitmap(resized, 0f, 0f, null); 
    paint.setColor(Color.BLACK); 
    canvas.drawRect(1, 145, 100, 130, paint); 
    paint.setColor(getResources().getColor(R.color.orange)); 
    paint.setTextSize(10); 
    paint.setFakeBoldText(true); 

    paint.setTextAlign(Paint.Align.LEFT); 
    float height = paint.measureText("yY"); 
    canvas.drawText(dateTime, 5f, height+130f, paint); 

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    dest.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); 
    byte[] byteArray = byteArrayOutputStream.toByteArray(); 
    String image1 = Base64.encodeToString(byteArray, Base64.DEFAULT); 

    //arrayList_image.add(image1); 
    BitmapDrawable background = new BitmapDrawable(dest); 
    //holder.imageItem.setBackground(background); 
    Damage_Item damage_item = new Damage_Item(); 
    damage_item.setTemp_image(dest); 
    gridArray.add(damage_item); 

    customGridAdapter.notifyDataSetChanged(); 


    /*gridView.setAdapter(customGridAdapter); 

    gridView.setOnItemClickListener(MainActivity.this)*/; 



} 
int count; 
private void inflateImageRow() { 

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View rowView = inflater.inflate(R.layout.dynamic_row, null); 
    dynamic_imageview = (ImageButton)rowView.findViewById(R.id.dynamic_imageview); 

    dynamic_linearview=(LinearLayout)rowView.findViewById(R.id.dynamic_linear); 

     dynamic_imageview.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //image_flagdynamic_right = true; 
      selectImage(); 
     } 
    }); 
    count= mContainerView.getChildCount()-1; 
    dynamic_imageview.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(final View v) { 
     int parent=((View) v.getParent()).getId(); 
     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
      builder.setTitle("Whould you like to delete this image?"); 
      builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        int index = ((View) v.getParent()).getId() + 2; 

        try { 
         mContainerView.removeView((View) v.getParent()); 
         // arrayList_image.remove(((View) v.getParent()).getId()); 
        } catch (IndexOutOfBoundsException e) { 
         e.printStackTrace(); 
        } 
        Toast.makeText(getApplicationContext(), "delete", Toast.LENGTH_LONG).show(); 
       } 
      }); 
      builder.setNegativeButton("No", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 

      return false; 
     } 
    }); 

    mContainerView.addView(rowView, mContainerView.getChildCount() - 1); 
} 

@Override 
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

} 
} 
0

Versuchen Sie xml zu ändern, indem die Gridview als Grid entfernt haben, sollten Sie die Größe des Bildes automatisch ändern. Eine andere nicht empfohlene Lösung wäre, die Bildschirmabmessungen für die Dimensionierung Ihres Bildes zu verwenden.