amir
amir

Reputation: 21

issue onactivityresult in recyclerview

i want to add images from gallery and add to arraylist and show them into recyclerview

but cant use onactivityresult in adapter -_-

i used Fishbun for add images from gallery but when i clicking ok the images not showing in recyclerview

im new in android and dont know how to do that

here is my MainActivity:

package com.example.myapuuuplication;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import com.sangcomz.fishbun.FishBun;
import com.sangcomz.fishbun.adapter.image.impl.GlideAdapter;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    Adapter adapter = new Adapter();
    List<Modell> uris = new ArrayList<>();

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

        RecyclerView rv = findViewById(R.id.rv);
        rv.setAdapter(adapter);
        rv.setLayoutManager(new LinearLayoutManager(this,RecyclerView.HORIZONTAL,false));

        Button btn = findViewById(R.id.button);
        btn
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        openpicker();

                    }
                });
    }

    private void openpicker() {
            FishBun.with(this).setImageAdapter(new GlideAdapter())
                    .setMaxCount(3)
                    .setActionBarColor(Color.parseColor("#5D4037"))
                    .startAlbum();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case FishBun.FISHBUN_REQUEST_CODE:
                if (resultCode == RESULT_OK) {
                    uris = data.getParcelableArrayListExtra(FishBun.INTENT_PATH);
                    adapter.setUris(uris);
                    break;
                }
        }
    }

}

Adapter:


package com.example.myapuuuplication;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.sangcomz.fishbun.FishBun;
import java.util.ArrayList;
import java.util.List;
import static android.app.Activity.RESULT_OK;

public class Adapter extends RecyclerView.Adapter<Adapter.VH> {

    List<Modell> uris = new ArrayList<>();
    public void setUris(List<Modell> uris) {
        this.uris = uris;
    }

    @NonNull
    @Override
    public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.model,parent,false);
        return new VH(view);
    }

    @Override
    public void onBindViewHolder(@NonNull VH holder, int position) {
        Modell modell = uris.get(position);
        VH vh = holder;
        vh.img.setImageURI(modell.getImg());
    }

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

    public class VH extends RecyclerView.ViewHolder{
        ImageView img;
        public VH(@NonNull View itemView) {
            super(itemView);
            img = itemView.findViewById(R.id.imgmodel);
        }
    }
}

And Model:

package com.example.myapuuuplication;

import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;

public class Modell implements Parcelable {
    Uri img;

    public Modell(Uri img) {
        this.img = img;
    }

    protected Modell(Parcel in) {
        img = in.readParcelable(Uri.class.getClassLoader());
    }

    public static final Creator<Modell> CREATOR = new Creator<Modell>() {
        @Override
        public Modell createFromParcel(Parcel in) {
            return new Modell(in);
        }

        @Override
        public Modell[] newArray(int size) {
            return new Modell[size];
        }
    };

    public Uri getImg() {
        return img;
    }

    public void setImg(Uri img) {
        this.img = img;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeParcelable(img, i);
    }
}

Upvotes: 1

Views: 191

Answers (1)

Sharukh Mohammed
Sharukh Mohammed

Reputation: 354

You are setting the adapter with

public void setUris(List<Modell> uris) {
        this.uris = uris;
}

But you must also let the recycler view know that there is a change in the data. For that you need to modify the function setUris to include notifyDataSetChanged()

Final code:

public void setUris(List<Modell> uris) {
        this.uris = uris;
        notifyDataSetChanged();
}

Upvotes: 1

Related Questions