2015-06-21 58 views
3

我有一个列表视图图像。我想更改列表项目图像onActivityResult 图像捕获。我得到的图像文件位图,但当我更改列表项目图像的列表视图图像不会改变。动态改变从内存Android的列表视图图像

final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), 
        options); 
      imageView1.setImageBitmap(bitmap);//there a bitmap exist--- 

      dataAdapter.taskList.get(0).setImgBitmap(bitmap); 

//这是不会改变列表image.why ??????? dataAdapter.notifyDataSetChanged(); 这里的imageview1有一个位图,我使用CustomAdapter类的ArrayList<Task> taskList参数将它设置为列表的第一项。

这里完整的示例代码

NotifyAcitivity.java

package com.aci.notification; 
public class NotifyActivity extends Activity { 

    // Activity request codes 
    private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100; 
    public static final int MEDIA_TYPE_IMAGE = 1; 

    // directory name to store captured images and videos 
    private static final String IMAGE_DIRECTORY_NAME = "Hello Camera"; 

    private Uri fileUri; // file url to store image/video 

    private ImageView imageView1; 
    Bitmap bm, bm2; 
    private Button btnCapturePicture; 
    ArrayList<Task> taskList = new ArrayList<Task>(); 
    TextView tv; 
    CustomAdapter dataAdapter = null; 
    Button btnSave; 
    ListView listView; 

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

     btnCapturePicture = (Button) findViewById(R.id.btnCapturePicture); 

     imageView1 = (ImageView) findViewById(R.id.imageView1); 
     tv = (TextView) findViewById(R.id.textViewtest); 

     btnSave = (Button) findViewById(R.id.button1); 
     listView = (ListView) findViewById(R.id.listView1); 

     new BitmapFactory(); 
     bm = BitmapFactory.decodeResource(getApplicationContext() 
       .getResources(), R.drawable.ic_launcher); 
     bm2 = BitmapFactory.decodeResource(getApplicationContext() 
       .getResources(), R.drawable.bydefault); 

     Task task; 
     task = new Task(0, "This is task1", "/pictures/hello camera/", bm,false); 
     taskList.add(task); 
     task = new Task(1, "This is task2", "/pictures/hello camera/", bm,false); 
     taskList.add(task); 
     task = new Task(0, "This is task3", "/pictures/hello camera/", bm,false); 
     taskList.add(task); 
     task = new Task(0, "This is task4", "/pictures/hello camera/", bm2,false); 
     taskList.add(task); 
     task = new Task(0, "This is task5", "/pictures/hello camera/", bm,false); 
     taskList.add(task); 

     dataAdapter = new CustomAdapter(this, R.layout.list_style, taskList); 

     listView.setAdapter(dataAdapter); 

    } 

    /** 
    * Receiving activity result method will be called after closing the camera 
    * */ 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // if the result is capturing Image 
     if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       // successfully captured the image 
       // display it in image view 
       previewCapturedImage(); 
      } 
     } 
    } 

    /** 
    * Display image from a path to ImageView 
    */ 
    private void previewCapturedImage() { 
     try { 
      imageView1.setVisibility(View.VISIBLE); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = 8; 
      final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), 
        options); 
      imageView1.setImageBitmap(bitmap); 

      dataAdapter.taskList.get(0).setImgBitmap(bitmap); 
      dataAdapter.notifyDataSetChanged(); 

     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
    } 

    public Uri getOutputMediaFileUri(int type) { 
     return Uri.fromFile(getOutputMediaFile(type)); 
    } 

} 

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<Task> { 
    public ArrayList<Task> taskList; 

    Context context; 
    public CustomAdapter(Context context, int resource, ArrayList<Task> taskList) { 
     super(context, resource, taskList); 
     this.context=context; 
     // TODO Auto-generated constructor stub 
     this.taskList = new ArrayList<Task>(); 
     this.taskList.addAll(taskList); 
    } 

    private class ViewHolder { 
      CheckBox task; 
      ImageView imageView; 
      int task_id; 
      Button imageCaptureBtnButton; 
      } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     ViewHolder viewHolder = null; 
     Log.v("ConvertView", String.valueOf(position)); 

     if (convertView == null) { 
      LayoutInflater vi =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.list_style, null); 

      viewHolder = new ViewHolder(); 

      viewHolder.task_id=taskList.get(position).getTask_id();//set task id of that task 

      viewHolder.task = (CheckBox) convertView.findViewById(R.id.checkBox1); 
      viewHolder.imageView=(ImageView) convertView.findViewById(R.id.imgPreview); 
      viewHolder.imageCaptureBtnButton=(Button) convertView.findViewById(R.id.btnCapturePicture); 

      viewHolder.imageView.setImageBitmap(taskList.get(position).getImgBitmap()); 

      convertView.setTag(viewHolder); 

      viewHolder.task.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        CheckBox cb = (CheckBox) v; 
        Task aTask =(Task) cb.getTag(); 
        Toast.makeText(context, 
          "Clicked on Checkbox: " + cb.getText() + " is " 
            + cb.isChecked(), Toast.LENGTH_LONG).show(); 
        aTask.setSelected(cb.isChecked()); 
       } 
      }); 

      viewHolder.imageCaptureBtnButton.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        Toast.makeText(context, "dddd", Toast.LENGTH_LONG).show(); 

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

     Task aTask = taskList.get(position); 
     viewHolder.task.setText(taskList.get(position).getTask()); 
     viewHolder.task.setChecked(taskList.get(position).isSelected()); 
     viewHolder.task.setTag(aTask); 
     return convertView; 
    } 
    @Override 
    public long getItemId(int arg0) { 
     return 0; 
    } 
    @Override 
    public int getCount() { 
     return taskList.size(); 
    } 
    @Override 
    public Task getItem(int arg0) { 
     return null; 
    } 

} 

Task.java

public class Task { 
    int task_id = 0; 
    String task = null; 
    String imageURL=null; 
    Bitmap imgBitmap; 
    boolean selected=false; 

    public Task(int task_id, String task, String imageURL,Bitmap imgBitmap, boolean selected) { 
     super(); 
     this.task_id = task_id; 
     this.task= task; 
     this.imageURL=imageURL; 
     this.imgBitmap=imgBitmap; 
     this.selected = selected; 
    } 
//all getters and setters here 
} 

我已经失去了我的日子。请帮助我。

回答

0

经过很长时间我找到了自己的问题答案。 代码与这个问题不完全匹配,因为答案来自我的另一个项目。我只是给我成功的方式。

步骤1:

当图像被捕获我请图象 - (位图的位图)。它的每个位图转换为base_64字符串和该方法中增加了新的图像的列表类型ByteDrawable的数组元素。

我再次创建新的适配器对象并将该适配器设置为 listview。

private void imagedata(Bitmap bitmap) { 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     // Must compress the Image to reduce image size to make upload easy 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
     byte[] byte_arr = stream.toByteArray(); 
     // Encode Image to String 
     image_data = Base64.encodeToString(byte_arr, 0); 
     byteDrawableList.add(new ByteDrawable(image_data)); 

     listAdapter = new CustomAdapter(this); 
     listView.setAdapter(listAdapter); 
    } 

    public class ByteDrawable { 
     String imageAsBytes; 
     public ByteDrawable(String imageAsBytes) { 
      this.imageAsBytes = imageAsBytes; 
     } 
    } 

第2步:

然后我填充我的名单从ArrayList和适配器类的构造函数我转换base_64字符串位图,并添加元素到本地的ArrayList items<Item>,然后在getview()方法我使用项目来创建列表视图。

private class CustomAdapter extends ArrayAdapter<ByteDrawable>{ 
    public CustomAdapter(Context context, int resource, ArrayList<ByteDrawable > byteDrawableList) { 
     super(context, resource, byteDrawableList); 
     this.context=context; 
     this.byteDrawableList= new ArrayList<ByteDrawable >(); 
     this.byteDrawableList.addAll(byteDrawableList); 
      inflater = LayoutInflater.from(context); 
      long k = 0; 
      for (ByteDrawable bd : byteDrawableList) { 
       String base = bd.getImageByteString(); 
       byte[] imageAsBytes = Base64.decode(base.getBytes(), 
         Base64.DEFAULT); 

       items.add(new Item(k, BitmapFactory.decodeByteArray(
         imageAsBytes, 0, imageAsBytes.length))); 
       k++; 
      } 

    } 
    private class Item { 
     final long itmeid; 
     final Bitmap drawabledata; 

     Item(long id, Bitmap bitmap) { 
      this.itmeid = id; 
      this.drawabledata = bitmap; 
     } 
    } 
    public View getView(final int position, View view, ViewGroup viewGroup) { 
     /* follow normal way to set data to list item*/ 
    } 
    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return items.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return items.get(i).itmeid; 
    } 
} 

希望这将有助于某人,如果他们面临同样的问题。