2017-09-01 76 views
0

PS:這是以前提出的問題的更新。在自定義相機佈局的水平視圖中設置圖像

我有一個自定義相機佈局,我需要圖像被設置爲水平和點擊時。我嘗試使用recyclerview。 首先,圖像被點擊被存儲在稱爲的位圖的結果中。

然後,我將圖像的路徑存儲在名爲路徑的變量中。路徑變量通過bundle傳遞給RecycleViewAdapter。

然後,使用onBindViewHolder,我試圖在水平視圖中顯示圖像。

 button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      camera.setCameraListener(new CameraListener() { 
       @Override 
       public void onPictureTaken(byte[] picture) { 
        super.onPictureTaken(picture); 
         Bitmap result = 
    BitmapFactory.decodeByteArray(picture, 0, picture.length); 

         ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
         result.compress(Bitmap.CompressFormat.JPEG, 25, bytes); 

         String path = MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), result, "Title", null); 
        horizontalList.add(path); 
         recycleViewAdapter = new RecycleViewAdapter(horizontalList); 
         horizontal_rv.setAdapter(recycleViewAdapter); 
         recycleViewAdapter.notifyDataSetChanged(); 
        mBundle = new Bundle(); 
        CameraActivity.mBundle.putString("abc", path); 
        horizontalList.add(path); 
       } 
      }); 
      camera.captureImage(); 

     } 
    }); 

然後傳遞給適配器類。

public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.MyViewHolder> { 
Uri uri; 
String path; 
private List<Bitmap> horizontalList; 
public class MyViewHolder extends RecyclerView.ViewHolder { 
    public ImageView image_result; 

    public MyViewHolder(View view) { 
     super(view); 
     image_result = (ImageView) view.findViewById(R.id.image_result); 

    } 
} 

public RecycleViewAdapter(ArrayList<Bitmap> horizontalList) { 
    this.horizontalList = horizontalList; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.recyclerview_item_row, parent, false); 

    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    path= CameraActivity.mBundle.getString("abc"); 
    uri=Uri.parse(path); 
    holder.image_result.setImageURI(uri); 


    holder.image_result.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     } 
    }); 
} 


@Override 
public int getItemCount() { 
    return horizontalList.size(); 
} 
} 

問題: 當我點擊的圖像,在每個點擊2份在圖像中示出。而以前的觀點發生了變化,顯示了新的圖像,使計數加倍。 此外,該應用程序最多3次點擊後崩潰。

的屏幕截圖是: enter image description here

請幫助。

+1

作爲謹慎的一句話,在適配器中保存位圖對象列表可能會很快給您一個OutOfMemoryException,請嘗試保留字符串引用或Uris。我也建議你使用畢加索或滑翔來做裝載,因爲它更容易使用。 –

+0

你總是創建適配器的新實例,因此它只需要sibgle值(最新的一個) –

+0

是的,我得到了那個錯誤。我正在考慮完成這項工作,然後轉向這個問題。不過謝謝。請詳細說明 – Harshita

回答

1
//I assume you are looping here 
Bitmap result = BitmapFactory.decodeByteArray(picture, 0, picture.length); 

        ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
        result.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 

        String path = MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), result, "Title", null); 

        CameraActivity.mBundle.putString("abc",path); 
        horizontalList.add(result); 
        // finish loop.................... 
//notify the adapter of data changes 
recycleViewAdapter.notifyDatasetChanged(); 

在循環內創建一個新的適配器意味着只能顯示一個項目,同時效率也很低。循環並添加循環中的元素,並在循環之後,通知適配器數據更改。

+0

在適配器中加載映像。這可能是非常蹩腳的,但.notifyDatasetChanged會給出錯誤。無法解析方法 – Harshita

+0

'notifyDataSetChanged()'是正確的方法。如果未啓用,您應該在ide中啓用輸入建議/智能感知 –