【问题标题】:set images in horizontal view in a custom camera layout在自定义相机布局中设置水平视图中的图像
【发布时间】:2017-09-01 11:21:09
【问题描述】:

PS:这是对之前提出的问题的更新。

我有一个自定义相机布局,我需要在单击图像时将图像设置为水平。我尝试为此使用recyclerview。 首先,被点击的图像存储在一个名为result的位图中。

然后,我将图像的路径存储在一个名为 path 的变量中。 path 变量通过 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 次后崩溃。

截图如下:

请帮忙。

【问题讨论】:

  • 请注意,在适配器中保留位图对象列表可能会很快给您一个 OutOfMemoryException,请尝试保留字符串引用或 Uris。我还建议您使用 Picasso 或 Glide 来进行加载,因为它更易于使用。
  • 你总是在创建适配器的新实例,因此它只需要一个值(最新的)
  • 是的,我收到了那个错误。我想把这件事做好,然后再谈这个问题。不过还是谢谢。
  • @ĜüptåŠhãsĥwæt 请详细说明。我连一张图片都没有显示。
  • 您正在适配器中传递列表,但您没有在适配器中的任何位置使用该列表,仅从该列表中获取路径的值

标签: android android-recyclerview


【解决方案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();

在循环内创建一个新适配器意味着只能显示一个项目,同时效率也很低。循环并添加循环中的元素,循环后通知适配器数据变化。

【讨论】:

  • 这可能很蹩脚,但 .notifyDatasetChanged 给出了错误。无法解析方法
  • notifyDataSetChanged() 是正确的方法。您应该在您的 ide 中启用输入建议/智能感知,以防它未启用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多