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

时间:2018-07-06 04:35:05

标签: android android-recyclerview fragment android-glide

你好,我试图将数据从Fragment中的RecyclerView传递到我的活动中。但是该应用程序崩溃了。当我尝试打开另一个活动时,该代码有效,因此我猜错误是在我的Gallery.java活动中。 我尝试将.asBitMap放在Gallery.java Activit中显示Glide的位置,但是将其标记为错误 这是我的Gallery.java

4

这是我的适配器类

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);


    }
}

4 个答案:

答案 0 :(得分:1)

问题是:

您发送包裹:

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

但以String形式获取

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 如果要发送可绘制对象,请首先将其转换为字节数组

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.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 ,最后,使用上述两种方法,当通过意图传递可绘制对象时,我们有一种解决您的问题的方法

   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);

答案 1 :(得分:0)

如果仅传递image_url和image_name,则无需传递Parcelable。只需传递意图中的唯一字符串即可。

 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.

答案 2 :(得分:0)

除了@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);)

并按如下所示将其恢复到另一个活动中,

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

答案 3 :(得分:0)

实际上,无需在onBindViewHolder中进行意图。用这种方式做

 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);
        }
    });