簡體   English   中英

使用Glide將數據從Fragment中的RecyclerView傳遞到Activity時,應用程序崩潰

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

您好,我正在嘗試將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);
        }
    }
}

問題是:

您發送包裹:

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"

UPDATE 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如果有一個drawable,我們需要將其轉換為位圖

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

UPDATE 3 ,最后,使用上述兩種方法,當通過意圖傳遞drawable時,我們有一種解決您的問題的方法

   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,只需傳遞意圖中的唯一字符串即可。

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

然后將其恢復到另一個活動中,如下所示:

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

實際上,不需要在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);
        }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM