使用 Glide 将数据从 Fragment 中的 RecyclerView 传递到 Activity 时,应用程序崩溃

App crashes when passing data from RecyclerView in Fragment to Activity with Glide

您好,我正在尝试将数据从 Fragment 中的 RecyclerView 传递到我的 activity。但是应用程序崩溃了。当我尝试打开另一个 activity 时代码有效,所以我猜错误在我的 Gallery.java activity 中。 我尝试将 .asBitMap 放在 Gallery.java Activit 中显示 Glide 的位置,但它被标记为错误 这是我的 Gallery.java

package co.quindio.sena.navigationdrawerejemplo;

import android.nfc.Tag;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

public class Gallery extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gallery);
        getIncomingIntent();
    }
    private void getIncomingIntent(){
       if(getIntent().hasExtra("image_url")){
           String imageUrl = getIntent().getStringExtra("image_url");
           String imageName = getIntent().getStringExtra("image_name");
           setImage(imageUrl,imageName);
        }
    }
    private void setImage(String imageUrl, String imageName){
        TextView name= (TextView) findViewById(R.id.idInfo);
        ImageView image= (ImageView) findViewById(R.id.idImagen);
        Glide.with(this)


                .load(imageUrl)
                .into(image);


    }
}

这是我的适配器 class

package co.quindio.sena.navigationdrawerejemplo.adapters;

import android.content.Context;
import android.content.Intent;
import android.os.Parcelable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;

import co.quindio.sena.navigationdrawerejemplo.Gallery;
import co.quindio.sena.navigationdrawerejemplo.R;
import co.quindio.sena.navigationdrawerejemplo.clases.PersonajeVo;
import de.hdodenhof.circleimageview.CircleImageView;

/**
 * Created by CHENAO on 13/07/2017.
 */

public class PersonajesAdapter extends RecyclerView.Adapter<PersonajesAdapter.PersonajeViewHolder>{

    ArrayList<PersonajeVo> listaPersonaje;
    private Context mContext;

    public PersonajesAdapter(Context context,ArrayList<PersonajeVo> listaPersonaje) {
        this.listaPersonaje=listaPersonaje;
        this.mContext=context;
        ArrayList<String> mImages = new ArrayList<>();
        ArrayList<String>mImageNames = new ArrayList<>();
    }

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

    @Override
    public void onBindViewHolder(PersonajeViewHolder holder, final int position) {
        holder.txtNombre.setText(listaPersonaje.get(position).getNombre());
        holder.txtInformacion.setText(listaPersonaje.get(position).getInfo());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, Gallery.class);


                intent.putExtra("image_url", (Parcelable) listaPersonaje.get(position));
                intent.putExtra("image_name", (Parcelable) listaPersonaje.get(position));
                mContext.startActivity(intent);
            }
        });
    }

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

    public class PersonajeViewHolder extends RecyclerView.ViewHolder {
        TextView txtNombre,txtInformacion;
        ImageView foto;

        public PersonajeViewHolder(View itemView) {
            super(itemView);
            txtNombre= (TextView) itemView.findViewById(R.id.idNombre);
            txtInformacion= (TextView) itemView.findViewById(R.id.idInfo);
            foto= (ImageView) itemView.findViewById(R.id.idImagen);
        }
    }
}

问题是:

您发送一个 Parcelable:

intent.putExtra("image_url", (Parcelable) listaPersonaje.get(position));
                intent.putExtra("image_name", (Parcelable) listaPersonaje.get(position));

但将其作为字符串获取

String imageUrl = getIntent().getStringExtra("image_url");
           String imageName = getIntent().getStringExtra("image_name");

所以请使用 getIntent().getParcelableExtra("image_url")getIntent().getParcelableExtra("image_name")

或发送字符串

intent.putExtra("image_url", listaPersonaje.get(position).getImageUrl());
                intent.putExtra("image_name",listaPersonaje.get(position).getImageName());

假设 listaPersonaje 项目有 getImageName()getImageUrl() 方法获取 "image_url""image_name"

更新 1 如果你想发送一个 drawable,首先,将它转换为字节数组

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_resource);     
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
byte[] b = baos.toByteArray(); 

并通过 intent extras 传递它, 发送:

intent.putExtra("image_url", b);

和接收者:

byte[] b = getIntent().getByteArray("image_url");

最后,用它来查看图片

Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);

更新 2 如果我们有绘图,我们需要将其转换为位图

public static Bitmap drawableToBitmap (Drawable drawable) {
    Bitmap bitmap = null;

    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        if(bitmapDrawable.getBitmap() != null) {
            return bitmapDrawable.getBitmap();
        }
    }

    if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
    } else {
        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    }

    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

更新 3,最后,使用上面的两种方式,我们有办法解决通过 intent

传递可绘制对象时的问题
   Drawable drawable = listaPersonaje.get(position).getImageUrl()
        // convert drawable to byte array
        Bitmap bitmap = drawableToBitmap(drawable);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        byte[] b = baos.toByteArray();
        // send it
        intent.putExtra("image_url", b);
        <!----------------------------------------------->
        // receiver
        byte[] b = getIntent().getByteArray("image_url");
        // and using glide to show it 
        Glide.with(this)
                .load(b)
                .asBitmap()
                .into(imageview);

如果您只传递 image_url 和 image_name,那么您无需传递,因为 Parcelable.you 只需传递意图中的唯一字符串。

 Intent intent = new Intent(mContext, Gallery.class);
                intent.putExtra("image_url",listaPersonaje.get(position));
                intent.putExtra("image_name", listaPersonaje.get(position));
                mContext.startActivity(intent);

And fetch data in Gallery Activity


String imageUrl = getIntent().getStringExtra("image_url");
           String imageName = getIntent().getStringExtra("image_name");


I hope its help you.

除了@gianhtran 的回答之外,我将在此处添加更多信息。

在 bindviewholder 方法中,您将通过 listaPersonaje.get(position) 获取 PersonajeVo 对象。

@Override
    public void onBindViewHolder(PersonajeViewHolder holder, final int position) {
        final PersonajeVo personajeVo = listaPersonaje.get(position);
        holder.txtNombre.setText(personajeVo.getNombre());
        holder.txtInformacion.setText(personajeVo.getInfo());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, Gallery.class);
                intent.putExtra("image_url", personajeVo.getImageUrl());
                intent.putExtra("image_name", personajeVo.getImageName());
                mContext.startActivity(intent);
            }
        });
    }

其次,如果你想要 PersonajeVo 对象的所有细节,那么你可以这样说,

    Intent intent = new Intent();
    intent.putExtra("personaje_obj",personajeVo); //make sure personjeVo model class is parcelable or cast it as (Parcelable)personajeVo
    mContext.startActivity(intent);)

然后在另一个 activity 中取回,如下所示,

Intent mIntent = getIntent();
if(mIntent!=null && mIntent.hasExtra("personaje_obj"))
{
PersonajeVo personajeVo = mIntent.getParcelableExtra("personaje_obj");
}

实际上不需要在onBindViewHolder 中进行intent。这样做

 public class PersonajeViewHolder extends RecyclerView.ViewHolder {
    TextView txtNombre,txtInformacion;
    ImageView foto;
    itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        int get = AdatperPosition();
   if(pos != RecyclerView.NO_POSITION){
   Item clickDataItem = listaPersonaje.get(position); 
   Intent intent = new Intent(mContext, Gallery.class);
   intent.putExtra("image_url", listaPersonaje.get(position));
   intent.putExtra("image_name",  listaPersonaje.get(position));
   mContext.startActivity(intent);
        }
    });