android 通过单击recyclerview项目,使recyclerView从相机或图库中选择图像

k4ymrczo  于 2022-12-09  发布在  Android
关注(0)|答案(4)|浏览(148)

我想让recyclerview第一个项目作为imageview添加图像标志,并点击后,从画廊选择一个图像,并设置为背景的图像视图和背景的第二个项目是添加图像标志

ghhaqwfi

ghhaqwfi1#

这可以通过以下方式实现
1.使用包含图像URL的自定义对象创建ArrayList
1.在ArrayList上仅添加一个对象
1.将适配器设置为从ArrayList中显示
1.在回收程序视图的绑定视图保持器中,如果url不存在,则显示addimageLogo
1.然后在点击图像上添加一个图像(路径/URL)在对象上的位置
1.在对象上添加图像后,检查最后一个对象是否具有URL,然后再次点2
1.通知数据集已更改()
自订对象

public class URLContainer{

    public URLContainer(String url, String imageName) {
        this.url = url;
        this.imageName = imageName;
    }

    String url;
    String imageName;// you can use other  required properties if you want
}

数组列表

private ArrayList<URLContainer> images = new ArrayList<>();

用于添加单个对象

private void addSingleContainer(){
        list.add(new URLContainer("",""));
}
whhtz7ly

whhtz7ly2#

您需要设置默认情况下将图像徽标添加到ImageView。在适配器内部,将OnClickListener()添加到ImageView,并编写代码以打开画廊获取图像,this将帮助您。

sd2nnvve

sd2nnvve3#

1.将viewType变量添加到数据类。在您的情况下,可以使用“Button”和“Image”。
1.将第一个对象的viewType值设置为“Button”
1.使用Multiple ViewHolder方法实现循环视图

覆盖getItemViewType

override fun getItemViewType(position: Int): Int {
        return when (orders[position].viewType) {
            ViewType.Button-> 1
            ViewType.Image-> 2
            else -> 1
        }
    }

在创建视图占位符时

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
            val viewHolder: RecyclerView.ViewHolder
            when (viewType) {
                1 -> {
                    val buttonBinding = DataBindingUtil.inflate<ItemButtonBinding>(
                        LayoutInflater.from(parent.context),
                        R.layout.item_button, parent, false
                    )
                    viewHolder = ButtonViewHolder(buttonBinding .root)
                }
                2 -> {
                    val imageBinding = DataBindingUtil.inflate<ItemImageBinding>(
                        LayoutInflater.from(parent.context),
                        R.layout.item_image, parent, false)
                    viewHolder = ImageViewHolder(imageBinding .root)
                }
                else -> {
                    val imageBinding = DataBindingUtil.inflate<ItemImageBinding>(
                        LayoutInflater.from(parent.context),
                        R.layout.item_image, parent, false)
                    viewHolder = ImageViewHolder(imageBinding .root)
                }
            }
            return viewHolder
      }

在绑定视图占位符上

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

            when (holder.itemViewType) {
                1 -> {
                    val buttonViewHolder = holder as ButtonViewHolder
                    configureButtonViewHolder(buttonViewHolder , position)
                }
                2 -> {
                    val imageViewHolder = holder as ImageViewHolder
                    configureImageViewHolder(imageViewHolder , position)
                }
                else -> {
                    val imageViewHolder = holder as ImageViewHolder
                    configureImageViewHolder(imageViewHolder , position)
                }
            }
        }

Button ViewHolder类中的Button ItemView上设置OnClickListener,并将图像选取器意图代码放置在OnClickListener
参考此answer

ar7v8xwq

ar7v8xwq4#

你可以试试这个,对我很有效
在主要活动中

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context=this;

        list=new ArrayList<>();
        list.add(String.valueOf(R.drawable.ic_baseline_add_24));

        recyclerView=findViewById(R.id.recycler);
        textView=findViewById(R.id.textView);
        button=findViewById(R.id.button);
        recyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3));
        adaptor=new Adapter(list, getApplicationContext(), new AdapterCallback() {
            @Override
            public void onMethodCallback(String path,int position) {

                if(position==list.size()-1){
                    openGallery();
                }else {
                    Intent intent = new Intent(MainActivity.this, MainActivity2.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.putExtra("pos", path);
                    startActivity(intent);
                }
            }
        });
        recyclerView.setAdapter(adaptor);

        button.setOnClickListener(this);

        if((ActivityCompat.checkSelfPermission(
                this,colum[0])!= PackageManager.PERMISSION_GRANTED)&&
                (ActivityCompat.checkSelfPermission(
                        this,colum[1])!= PackageManager.PERMISSION_GRANTED)){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(colum,123);
            }
        }
    }

    @Override
    public void onClick(View view) {
        openGallery();
    }
    private void openGallery() {
        Intent intent=new Intent();
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true);
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent,"Selcet Picture"),PICK);
    }
  @Override
    protected void onActivityResult(int requestCode, int resultCode,  Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==PICK && resultCode==RESULT_OK){
            if(data.getClipData()!=null){
                int x=data.getClipData().getItemCount();
                for(int i=0;i<x;i++){
                    list.add(list.size()-1,data.getClipData().getItemAt(i).getUri().toString());
                }

                adaptor.notifyDataSetChanged();
                textView.setText("Image("+list.size()+")");
            }else if(data.getData()!=null){
                String imgurl=data.getData().toString();
                list.add(list.size()-1,(imgurl));

                adaptor.notifyDataSetChanged();
                textView.setText("Image("+list.size()+")");
            }

在适配器类中,尝试以下操作

public Adapter(ArrayList list, Context context,AdapterCallback callback) {
        this.list = list;
        this.context = context;
        this.interface1 = callback;
    }

    View view;

    @Override
    public Adapter.RViewHolder onCreateViewHolder(ViewGroup v, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(v.getContext());
        view = inflater.from(v.getContext()).inflate(R.layout.data, v, false);
        RViewHolder viewHolder = new RViewHolder(view);
        return viewHolder;

    }

    @Override
    public void onBindViewHolder(Adapter.RViewHolder holder, int position) {

        path = list.get(position).toString();

        if(position==list.size()-1){
            holder.imageView.setImageResource(Integer.parseInt(path));
        }else holder.imageView.setImageURI(Uri.parse(path));

        int a=position+1;

        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              String  path1 = list.get(holder.getAdapterPosition()).toString();
                interface1.onMethodCallback(path1,holder.getAdapterPosition());
                Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();
            }
        });

输入接口

public interface AdapterCallback {
    void onMethodCallback(String data,int position);
}

在第二个活动中

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        imgfrag = findViewById(R.id.imgfrag);
        getincoming();
    }

    private void getincoming() {
        if (getIntent().hasExtra("pos")) {
            String imageUrl = getIntent().getStringExtra("pos");
            Glide.with(this).asBitmap().load(imageUrl).into(imgfrag);
        }
    }

相关问题