0

在我的应用程序中,我将图像添加到列表视图,并在转换为字符串后将这些图像传输到 serverlet。但是从列表视图中删除的图像也会转移。它从列表视图中删除,但字符串正在传输到 serverlet。这很烦人。我没有找到在 BaseAdapter 中添加这些行的位置。

                 Bitmap image=(Bitmap)getItem(position);
            ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
            image.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            //encode image
            byte[] b = bytes.toByteArray();
             encodedImageString = Base64.encodeToString(b, Base64.DEFAULT);
    //encodedImageString is sent to servlet, it's showing deleted image string also

这是BaseAdapter的完整代码

    public class MyAdapter extends BaseAdapter {
      ArrayList<HashMap<String, String>> imageHashMap=new ArrayList<HashMap<String,String>>();
        private LayoutInflater mInflater;

        public MyAdapter() {
            mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        }

        public int getCount() {
           // return myItems.size();
            return images.size();
        }

        public Bitmap getItem(int position) {
            return images.get(position);
            //return myItems.get(position);
        }

        public long getItemId(int position) {
           return position;
        }

        public View getView(final int position, View convertView,
                ViewGroup parent) {

              final Bitmap image=(Bitmap)getItem(position);


            final ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.imageview2, null);


                holder.image = (ImageView) convertView
                        .findViewById(R.id.imageView2);



                holder.Delete=(Button)convertView.findViewById(R.id.buttonClose);

                convertView.setTag(holder);


            } else {
                holder = (ViewHolder) convertView.getTag();



            }




            BitmapFactory.Options factoryOptions = new BitmapFactory.Options();

            int imageWidth = factoryOptions.inDensity=70;
            int imageHeight = factoryOptions.inDensity=65;

       Bitmap Scaled = Bitmap.createScaledBitmap(images.get(position), imageWidth, imageHeight, true);
            holder.image.setImageBitmap(Scaled);

            holder.image.setTag(position);

            String me=  holder.image.getTag().toString();
            holder.Delete.setTag(position);

            ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
            image.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            //encode image
            final ArrayList<HashMap<String, String>> imageHashMap=new ArrayList<HashMap<String,String>>();
            byte[] b = bytes.toByteArray();
             encodedImageString = Base64.encodeToString(b, Base64.DEFAULT);
            // StringImages.add(encodedImageString); 

            imageHashMap.putString(String.valueOf(image.getTag()), encodedImageString);



            holder.image.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View view) {
                    // TODO Auto-generated method stub


                    final Dialog imgDialog = new Dialog(view.getContext(),android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

                  imgDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
                  imgDialog.setCancelable(false);
                  //   layout imageview2 is used because when i use simple imageview layout dialogue with imageview and closebutton,  
                  //   every taken image at instance will not be shown in dialogue.
                  imgDialog.setContentView(R.layout.imageview);
                  Button btnClose = (Button)imgDialog.findViewById(R.id.btnIvClose);
                  ImageView ivPreview = (ImageView)imgDialog.findViewById(R.id.image1);






                  ivPreview.setImageBitmap(images.get(position));

                  btnClose.setOnClickListener(new OnClickListener() {
                      @Override
                      public void onClick(View arg0) {

                          imgDialog.dismiss();
                      }
                  });
                  imgDialog.show();




                       myAdapter.notifyDataSetChanged();
                        listviewattachment.setSelection(myAdapter.getCount()+1 );



                }
            });



            holder.Delete.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View view) {
                    // TODO Auto-generated method stub
                    int tag = (Integer) view.getTag();
                    if (tag != (images.size() )) {
                        images.remove(tag);

                        Log.d("GCM", "Item removed from " + tag);
                        myAdapter.notifyDataSetChanged();


                }
                    if(imageHashMap.contains(tag)) { 
                        imageHashMap.remove(tag); }


                }
            });


            return convertView;
        }

    }
4

1 回答 1

0

例如,使用 hashmap 看看这个:

Bitmap Scaled = Bitmap.createScaledBitmap(images.get(position), imageWidth,imageHeight,true);
holder.image.setImageBitmap(Scaled);
holder.image.setTag(position);
holder.Delete.setTag(position);
Bitmap image=(Bitmap)getItem(position);
ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
image.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
//encode image
byte[] b = bytes.toByteArray();
encodedImageString = Base64.encodeToString(b, Base64.DEFAULT);

StringImages.add(encodedImageString) -----> 而不是这一行,使用这样的哈希图

imageHashMap.put(String.valueOf(image.getTag()), encodedImageString);

并在 delete.onclicklistener 代码中,当您从图像中删除图像时,例如 images.remove(image),

添加这些行

if(imageHashMap.contains(image.getTag())) {
    imageHashMap.remove(image.getTag());
}

我希望这有帮助。 PS:使用前在构造函数中声明hashmap,否则可能会出现空指针异常

于 2013-10-11T06:13:22.067 回答