2016-05-07 13 views
6

काम नहीं कर रहा है मैं एक ही ग्रिडलेआउट में गतिशील रूप से बनाई गई छविदृश्य पर कैप्चर की गई छवि को सेट करना चाहता हूं लेकिन यह एक नया ग्रिड लेआउट बनाता है और कैप्चर की गई छवि को नए ग्रिडव्यू पर सेट करता है।ग्रिडलेआउट में गतिशील रूप से निर्मित छविदृश्य

यह मेरा mainactivity.java फ़ाइल

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

    } 
} 

है यह मेरा एडाप्टर फ़ाइल है 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; 
    } 
} 

मेरे activity_manin.xml फ़ाइल

<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

मुझे स्पष्ट रूप से समझ में नहीं आता है कि ग्रिडलेआउट के अंदर ग्रिड व्यू का उपयोग करने का क्या मतलब है ... आप केवल 2 कॉलम के साथ एक ग्रिड व्यू का उपयोग कर सकते हैं और जोड़ सकते हैं छवि दृश्य गतिशील रूप से। जैसा कि मैंने देखा, आप समस्या को प्रत्येक बार 'onCaptureImageResult()' में पास करते समय एडाप्टर को फिर से बनाने लगते हैं। आपको इसे एक बार बनाना चाहिए और 'NotifyDataSetChanged() 'को कॉल करके इसे रीफ्रेश करना चाहिए। – Fllo

उत्तर

0

सबसे पहले ऐसा लगता है कि आप अपने कस्टमएडाप्टर_बैक में धारक पैटर्न का उपयोग नहीं कर रहे हैं क्योंकि फ्लो ने देखा है कि आपको मैन्युअल रूप से विचारों को हटाने की आवश्यकता नहीं है। संवाद

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

से इस समारोह अपने एडाप्टर

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

को यह समारोह जोड़ सकते हैं और फोन activityResult पर आप कोड का एक 2 पंक्तियाँ में:

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

तो हर बार जब आप एक नई छवि जोड़ रहे हैं तो आप एडाप्टर को दोबारा बना रहे हैं।

बस खाली सूची के साथ एडाप्टर घोषणा को स्थानांतरित करें। जोड़ें विधि

public void addItem(Damage_Item item){ 
    this.Damage_Item.add(item); 
    this.notifyDataSetChange(); 
} 
अपने एडाप्टर के लिए

और बदले एडाप्टर बनाने और अपने onCaptureImageResult के अंदर नए स्थापित करने का यह ट्रिगर।

और भगवान के लिए, नामकरण सम्मेलन। आपका कोड पढ़ने योग्य नहीं है

0

प्रयास करें इस

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

GridView gridlayout के रूप में दूर करने के लिए स्वचालित रूप छवि का आकार बदलना चाहिए द्वारा अपने xml बदलने का प्रयास करें। एक अन्य गैर-अनुशंसित समाधान आपकी छवि का आकार बदलने के लिए स्क्रीन आयामों का उपयोग करना होगा

संबंधित मुद्दे