【问题标题】:App crashes when passing data from RecyclerView in Fragment to Activity with Glide [duplicate]使用 Glide 将数据从 Fragment 中的 RecyclerView 传递到 Activity 时,应用程序崩溃 [重复]
【发布时间】:2018-07-06 04:35:04
【问题描述】:

您好,我正在尝试将来自 Fragment 中的 RecyclerView 的数据传递给我的活动。但是应用程序崩溃了。当我尝试打开另一个活动时,代码有效,所以我猜测错误在我的 Gallery.java 活动中。 我尝试将 .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);


    }
}

这是我的适配器类

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

【问题讨论】:

  • App crashes 您的崩溃报告在哪里,请与问题分享该崩溃日志
  • 当您没有要显示的堆栈跟踪时,人们应该如何帮助您?

标签: android android-recyclerview fragment android-glide


【解决方案1】:

问题是:

您发送一个 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" 值

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

UPDATE 2如果我们有一个drawble,我们需要将它转换为位图

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

【讨论】:

  • 适用于文本,但不适用于图像。如何在新的 Activity 中获取图片??
  • 它是一个可绘制对象,我也在尝试传递一个可绘制对象以及文本
  • 让我提醒你,imageview 是recyclerview 的一部分,所以我不能调用特定drawable 的名称。它必须根据我在 RecyclerView 上单击的项目来工作
  • getResources 应该获取图像吗?所以我必须将该 getter 更改为我之前创建的 getter 的名称
  • 哦,我的错,如果listaPersonaje.get(position).getImageUrl())返回一个drawble,我们需要将它转换为位图,然后将位图转换为字节数组,我更新了我的答案,请再次检查
【解决方案2】:

如果你只传递 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.

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 什么是personajeVo?而且图片名不是文件名,而是一个textView。
    • @LuisRivera PersonajeVo 是我认为的模型类,它包含字段 String imageName、imageUrl 以及两者的 getter 和 setter,它应该实现 Parcelable。 'personajeVo' 是该类的对象。最终,Arraylist 应该是 ArrayList listaPersonaje.
    【解决方案4】:

    其实不需要在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);
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      相关资源
      最近更新 更多