Dynamically generated image in gridlayout not working

I want to set the captured image to a dynamically created image in the same gridlayout, but it creates a new grid layout and sets the captured image to a new gridview.

This is my mainactivity.java file

 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) { } } 

this is my CustomAdapter_back.java adapter 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; } } 

My activity_manin.xml file

 <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> 
+6
source share
4 answers

At first it seems that you are not using the owner template in your CustomAdapter_back, since Fllo noticed that you do not need to manually delete views. add this function to the adapter

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

and call this function from the dialog box

  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
source

in on activityResult you have 2 lines of code:

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

so every time you add a new image, you recreate the adapter.

Just move the adapter declaration to onCreate with an empty list. Add method

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

to your adapter and activate it instead of creating an adapter and setting a new one inside your onCaptureImageResult.

And for God's sake, a naming convention. Your code is not readable

0
source

try it

 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
source

Try changing the xml by deleting the GridView, as the gridlayout should automatically resize the image. Another recommended solution would be to use screen sizes to determine the size of the image.

0
source

All Articles